מדריך לממשק החיצוני ב- Java

1. הקדמה

במדריך זה, נסתכל במהירות על ג'אווה java.io. ניתן להחצנה מִמְשָׁק. המטרה העיקרית של ממשק זה היא להקל על סדרת סדרים ועריקול בהתאמה אישית.

לפני שנתקדם, הקפד לבדוק את הסידור במאמר Java. הפרק הבא עוסק כיצד לסדר אובייקט Java באמצעות ממשק זה.

לאחר מכן, נדון בהבדלי המפתח בהשוואה ל- java.io ניתן להתבצע באמצעות סריאליזציה מִמְשָׁק.

2. ה ניתן להחצנה מִמְשָׁק

ניתן להחצנה משתרע על java.io ניתן להתבצע באמצעות סריאליזציה ממשק סמן. כל כיתה שמתיישמת ניתן להחצנה ממשק צריך לעקוף את writeExternal (), readExternal () שיטות. בדרך זו אנו יכולים לשנות את התנהגות ברירת המחדל של סדרת ה- JVM.

2.1. סידור

בואו נסתכל על הדוגמה הפשוטה הזו:

מחלקה ציבורית מיישמת מדינה ניתנת להמחצה {פרטית סטטית פרטית ארוכת טווח סיבית = 1 ליטר; שם מחרוזת פרטי; קוד אינטי פרטי; // getters, setters @ Override public void writeExternal (ObjectOutput out) זורק IOException {out.writeUTF (שם); out.writeInt (קוד); } @ עקירה ציבורית ריק ריק readExternal (ObjectInput in) זורק IOException, ClassNotFoundException {this.name = in.readUTF (); this.code = in.readInt (); }}

הנה, הגדרנו כיתה מדינה שמיישם את ניתן להחצנה ממשק ומיישם את שתי השיטות שהוזכרו לעיל.

בתוך ה writeExternal () שיטה, אנו מוסיפים את מאפייני האובייקט ל- ObjectOutput זרם. יש לזה שיטות סטנדרטיות כמו writeUTF () ל חוּט ו writeInt () לערכי int.

הַבָּא, על עריקת הערך של האובייקט, אנו קוראים מתוך אובייקט קלט זרם משתמש ב readUTF (), readInt () שיטות לקריאת המאפיינים באותו סדר מדויק בו נכתבו.

זה נוהג טוב להוסיף את serialVersionUID באופן ידני. אם זה לא קיים, ה- JVM יוסיף אוטומטית אחד כזה.

המספר שנוצר אוטומטית תלוי במהדר. זה אומר שזה עלול לגרום לבלתי סביר InvalidClassException.

בואו לבדוק את ההתנהגות שיישמנו לעיל:

@ מבחן ציבורי בטל כאשר Serializing_thenUseExternalizable () זורק IOException, ClassNotFoundException {מדינה c = מדינה חדשה (); c.setCode (374); c.setName ("ארמניה"); FileOutputStream fileOutputStream = FileOutputStream חדש (OUTPUT_FILE); ObjectOutputStream objectOutputStream = ObjectOutputStream חדש (fileOutputStream); c.writeExternal (objectOutputStream); objectOutputStream.flush (); objectOutputStream.close (); fileOutputStream.close (); FileInputStream fileInputStream = FileInputStream חדש (OUTPUT_FILE); ObjectInputStream objectInputStream = ObjectInputStream חדש (fileInputStream); מדינה c2 = מדינה חדשה (); c2.readExternal (objectInputStream); objectInputStream.close (); fileInputStream.close (); assertTrue (c2.getCode () == c.getCode ()); assertTrue (c2.getName (). שווה ל- (c.getName ())); }

בדוגמה זו ראשית אנו יוצרים a מדינה התנגד וכתב אותו לקובץ. לאחר מכן אנו מבטלים את עריכת האובייקט מהקובץ ומוודאים שהערכים נכונים.

פלט המודפס c2 לְהִתְנַגֵד:

מדינה {name = 'ארמניה', קוד = 374}

זה מראה שנטרלנו את האובייקט בהצלחה.

2.2. יְרוּשָׁה

כאשר כיתה יורשת מה- ניתן לבצע סדרתי ממשק, ה- JVM אוסף באופן אוטומטי את כל השדות גם משיעורי משנה והופך אותם לסידוריים.

זכור שנוכל ליישם זאת על ניתן להחצנה גם כן. עלינו רק ליישם את שיטות הקריאה / כתיבה לכל תת-מחלקה בהיררכיית הירושה.

בואו נסתכל על אזור הכיתה שמתחתיו משתרעת שלנו מדינה מהסעיף הקודם:

מחלקה ציבורית אזור מרחיב כלי יישומי ניתן להחצאה {פרטית סטטית פרטית ארוכה serialVersionUID = 1L; אקלים מיתרי פרטי; אוכלוסייה זוגית פרטית; // getters, setters @ Override public void writeExternal (ObjectOutput out) זורק IOException {super.writeExternal (out); out.writeUTF (אקלים); } @Override public void readExternal (ObjectInput in) זורק IOException, ClassNotFoundException {super.readExternal (in); this.climate = in.readUTF (); }}

כאן הוספנו שני מאפיינים נוספים וסידרנו את הראשון.

ציין זאת גם אנחנו התקשרנו super.writeExternal (out), super.readExternal (in) בשיטות סדרתיות כדי לשמור / לשחזר גם את שדות מחלקת ההורים.

בואו נפעיל את בדיקת היחידה עם הנתונים הבאים:

אזור r = אזור חדש (); r.setCode (374); r.setName ("ארמניה"); r.setClimate ("ים תיכוני"); r.setPopulation (120.000);

הנה האובייקט שהוזז:

אזור {מדינה = "מדינה {name =" ארמניה ', קוד = 374}' אקלים = "ים תיכוני", אוכלוסייה = null}

שים לב ש מכיוון שלא סידרנו את אוּכְלוֹסִיָה שדה ב אזור class, הערך של נכס זה הוא ריק.

3. ניתן להחצנה לעומת ניתן לבצע סדרתי

בואו נעבור על ההבדלים העיקריים בין שני הממשקים:

  • אחריות סדרתית

ההבדל העיקרי כאן הוא האופן שבו אנו מטפלים בתהליך הסידור. כאשר כיתה מיישמת את java.io ניתן להתבצע באמצעות סריאליזציה ממשק, ה- JVM לוקח אחריות מלאה על סדרת מופע הכיתה. במקרה ניתן להחצנה, זה המתכנת שצריך לדאוג לכל תהליך הסידור וגם לניתוק עריקה.

  • שימוש במקרה

אם עלינו לסדר את האובייקט כולו, ניתן לבצע סדרתי ממשק מתאים יותר. מצד שני, לסידור מותאם אישית אנו יכולים לשלוט בתהליך באמצעות ניתן להחצנה.

  • ביצועים

ה java.io ניתן להתבצע באמצעות סריאליזציה הממשק משתמש בבבואה ומטא נתונים הגורמים לביצועים איטיים יחסית. לשם השוואה, ה ניתן להחצנה ממשק נותן לך שליטה מלאה בתהליך הסידור.

  • צו קריאה

תוך כדי שימוש ניתן להחצנה, חובה לקרוא את כל מצבי השדה בסדר המדויק כפי שנכתבו. אחרת, נקבל חריג.

לדוגמא, אם נשנה את סדר הקריאה של ה- קוד ו שֵׁם נכסים ב מדינה כיתה, א java.io.EOFException ייזרק.

בינתיים, ניתן לבצע סדרתי לממשק אין דרישה זו.

  • סידור מותאם אישית

אנו יכולים להשיג סידור מותאם אישית באמצעות ניתן לבצע סדרתי ממשק על ידי סימון השדה באמצעות חולף מילת מפתח. ה- JVM לא יסדר את השדה המסוים אך יוסיף את השדה לאחסון קבצים עם ערך ברירת המחדל. לכן זה נוהג טוב להשתמש בו ניתן להחצנה במקרה של סידור מותאם אישית.

4. מסקנה

במדריך קצר זה ל ניתן להחצנה ממשק, דנו בתכונות העיקריות, היתרונות והדגמנו דוגמאות לשימוש פשוט. ערכנו גם השוואה עם ניתן לבצע סדרתי מִמְשָׁק.

כרגיל, קוד המקור המלא של ההדרכה זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found