מבוא לסידור Java

1. הקדמה

סידור הוא המרת מצבו של אובייקט לזרם בתים; התנערות עושה את ההפך. באופן שונה, סדרת סדר היא המרה של אובייקט Java לזרם סטטי (רצף) של בתים אשר לאחר מכן ניתן לשמור למסד נתונים או להעביר ברשת.

2. סידור ועריקול

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

שניהם ObjectInputStream ו ObjectOutputStream הם שיעורים ברמה גבוהה שמתארכים java.io.InputStream ו java.io.OutputStream בהתאמה. ObjectOutputStream יכול לכתוב סוגים וגרפים פרימיטיביים של אובייקטים ל- OutputStream כזרם בתים. לאחר מכן ניתן לקרוא זרמים אלה באמצעות ObjectInputStream.

השיטה החשובה ביותר ב ObjectOutputStream הוא:

בטל סופי ציבורי ריק אובייקט (אובייקט o) זורק IOException;

שלוקח אובייקט מסודר וממיר אותו לרצף (זרם) של בתים. באופן דומה, השיטה החשובה ביותר ב- ObjectInputStream הוא:

גמר ציבורי אובייקט readObject () זורק IOException, ClassNotFoundException;

שיכול לקרוא זרם בתים ולהמיר אותו בחזרה לאובייקט ג'אווה. לאחר מכן ניתן להשליך זאת לאובייקט המקורי.

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

אדם ממעמד ציבורי מיישם Serializable {פרטי סטטי פרטי סופי ארוךVERSIONUID = 1L; מדינה מחרוזתית סטטית = "איטליה"; גיל פרטי פרטי; שם מחרוזת פרטי; גובה אינטנסיבי חולף; // גטרים וקובעים}

הבדיקה שלהלן מציגה דוגמה לשמירת אובייקט מסוג אדם לקובץ מקומי ואז קרא ערך זה בחזרה ב:

@ מבחן ציבורי בטל כאשר SerializingAndDeserializing_ThenObjectIsTheSame () () זורק IOException, ClassNotFoundException {אדם אדם = אדם חדש (); person.setAge (20); person.setName ("ג'ו"); FileOutputStream fileOutputStream = FileOutputStream חדש ("yourfile.txt"); ObjectOutputStream objectOutputStream = ObjectOutputStream חדש (fileOutputStream); objectOutputStream.writeObject (אדם); objectOutputStream.flush (); objectOutputStream.close (); FileInputStream fileInputStream = FileInputStream חדש ("yourfile.txt"); ObjectInputStream objectInputStream = ObjectInputStream חדש (fileInputStream); אדם p2 = (אדם) objectInputStream.readObject (); objectInputStream.close (); assertTrue (p2.getAge () == p.getAge ()); assertTrue (p2.getName (). שווה ל- (p.getName ())); }

השתמשנו ObjectOutputStream לשמירת מצב אובייקט זה בקובץ באמצעות FileOutputStream. הקובץ "Yourfile.txt" נוצר בספריית הפרויקט. קובץ זה נטען באמצעות FileInputStream.ObjectInputStream מרים את הזרם הזה וממיר אותו לאובייקט חדש שנקרא p2.

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

שים לב שהאובייקט הטעון צריך להיות יצוק במפורש אל אדם סוּג.

3. אזהרות בסידור Java

יש כמה אזהרות הנוגעות לסידור ב- Java.

3.1. ירושה והרכב

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

אנשים בכיתה ציבורית מיישמים לפי סדר {גילאי פרטי; שם מחרוזת פרטי; מדינה כתובת פרטית; // חייבים להיות מסודרים גם} 

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

3.2. גרסה טורית UID

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

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

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

3.3. סידור מותאם אישית ב- Java

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

ריק ריק לכתובObject (ObjectOutputStream החוצה) זורק IOException;

ו

חלל פרטי readObject (ObjectInputStream in) זורק IOException, ClassNotFoundException;

בעזרת שיטות אלה, אנו יכולים לסדר את התכונות הללו שאינן ניתנות לעריכה לסדרות אחרות לצורות אחרות שניתן לסדרן:

יישומי עובדים בכיתה ציבורית ניתן לבצע סידור {פריטי סטטי פרטי סופי ארוך ארוךVERSIONUID = 1L; כתובת כתובת חולפת פרטית; אדם פרטי פרטי; // קובעים וקובעים פרטיים בטל לכתובObject (ObjectOutputStream oos) זורק IOException {oos.defaultWriteObject (); oos.writeObject (address.getHouseNumber ()); } ריק ריק ריק אובייקטי (ObjectInputStream ois) זורק ClassNotFoundException, IOException {ois.defaultReadObject (); בית מספר שלם = (מספר שלם) ois.readObject (); כתובת a = כתובת חדשה (); a.setHouseNumber (houseNumber); this.setAddress (א); }}
כתובת בכיתה ציבורית כתובת {private int houseNumber; // סטרים וגטררים}

בדיקת היחידה הבאה בודקת את הסידור המותאם אישית הזה:

@ מבחן ציבורי בטל כאשר CustomSerializingAndDeserializing_ThenObjectIsTheSame () זורק IOException, ClassNotFoundException {אדם p = אדם חדש (); p.setAge (20); p.setName ("ג'ו"); כתובת a = כתובת חדשה (); a.setHouseNumber (1); עובד e = עובד חדש (); e.setPerson (p); e.setAddress (א); FileOutputStream fileOutputStream = FileOutputStream חדש ("yourfile2.txt"); ObjectOutputStream objectOutputStream = ObjectOutputStream חדש (fileOutputStream); objectOutputStream.writeObject (ה); objectOutputStream.flush (); objectOutputStream.close (); FileInputStream fileInputStream = FileInputStream חדש ("yourfile2.txt"); ObjectInputStream objectInputStream = ObjectInputStream חדש (fileInputStream); עובד e2 = (עובד) objectInputStream.readObject (); objectInputStream.close (); assertTrue (e2.getPerson (). getAge () == e.getPerson (). getAge ()); assertTrue (e2.getAddress (). getHouseNumber () == e.getAddress (). getHouseNumber ()); }

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

4. מסקנה

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

כמו תמיד, קוד המקור המשמש במדריך זה זמין ב- GitHub.