logo

סריאליזציה וביטול סדרה ב-Java

  1. סדרה
  2. ממשק שניתן לסידרה
  3. דוגמה לסריאליזציה
  4. דוגמה לדה-סריאליזציה
  5. סדרה עם ירושה
  6. ממשק להחצנה
  7. סריאליזציה וחבר נתונים סטטיים

סדרה ב-Java הוא מנגנון של כתיבת מצב של אובייקט לתוך זרם בתים . הוא משמש בעיקר בטכנולוגיות Hibernate, RMI, JPA, EJB ו-JMS.

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

עבור הסדרת האובייקט, אנו קוראים את writeObject() שיטה של ObjectOutputStream מחלקה, ולצורך דה-סריאליזציה אנו קוראים את readObject() שיטה של ObjectInputStream מעמד.

אנחנו חייבים ליישם את ניתן להסדרה ממשק לסידור האובייקט.

היתרונות של Java Serialization

הוא משמש בעיקר כדי להעביר את מצב האובייקט ברשת (המכונה מרשלינג).

סריאליזציה של java

ממשק java.io.Serializable

ניתן להסדרה הוא ממשק סמן (אין לו איבר ושיטה של ​​נתונים). הוא משמש כדי 'לסמן' מחלקות Java כך שהאובייקטים של מחלקות אלה עשויים לקבל יכולת מסוימת. ה ניתן לשחזור ו מְרוּחָק הם גם ממשקי סמן.

10 בחזקת 6

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

מחלקת ה-String וכל מחלקות העטיפה מיישמות את java.io.ניתן לסדרה ממשק כברירת מחדל.

בוא נראה את הדוגמה שניתנה להלן:

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

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

מחלקה ObjectOutputStream

המחלקה ObjectOutputStream משמשת לכתיבת סוגי נתונים פרימיטיביים, ואובייקטי Java ל-OutputStream. ניתן לכתוב לזרמים רק אובייקטים התומכים בממשק java.io.Serializable.

בַּנַאִי

1) public ObjectOutputStream(OutputStream out) זורק את IOException {}זה יוצר ObjectOutputStream שכותב ל-OutputStream שצוין.

שיטות חשובות

שיטהתיאור
1) public final void writeObject(Object obj) זורק את IOException {}זה כותב את האובייקט שצוין ל-ObjectOutputStream.
2) public void flush() זורק את IOException {}זה שוטף את זרם הפלט הנוכחי.
3) public void close() זורק את IOException {}זה סוגר את זרם הפלט הנוכחי.

מחלקה ObjectInputStream

ObjectInputStream מסיר אובייקטים ונתונים פרימיטיביים שנכתבים באמצעות ObjectOutputStream.

בַּנַאִי

1) public ObjectInputStream(InputStream in) זורק את IOException {}זה יוצר ObjectInputStream שקורא מ-InputStream שצוין.

שיטות חשובות

שיטהתיאור
1) public final Object readObject() זורק את IOException, ClassNotFoundException{}הוא קורא אובייקט מזרם הקלט.
2) public void close() זורק את IOException {}זה סוגר את ObjectInputStream.

דוגמה ל-Java Serialization

בדוגמה זו, אנו הולכים לעשות סדרה של האובייקט של סטוּדֶנט קוד מחלקה מלמעלה. שיטת writeObject() של מחלקה ObjectOutputStream מספקת את הפונקציונליות להסדרת האובייקט. אנו שומרים את מצב האובייקט בקובץ בשם f.txt.

Persist.java

 import java.io.*; class Persist{ public static void main(String args[]){ try{ //Creating the object Student s1 =new Student(211,'ravi'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} } } 

תְפוּקָה:

 success 
הורד את הדוגמה הזו של סדרה

דוגמה ל-Deserialization של Java

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

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

Depersist.java

 import java.io.*; class Depersist{ public static void main(String args[]){ try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

תְפוּקָה:

211 ravi 
הורד את הדוגמה הזו של דה-סריאליזציה

Java Serialization with Heritation (יחסי IS-A)

אם כיתה מיישמת ממשק שניתן לסידרה אז כל מחלקות המשנה שלו יהיו ניתנות לסידרה. בוא נראה את הדוגמה שניתנה להלן:

SerializeISA.java

 import java.io.Serializable; class Person implements Serializable{ int id; String name; Person(int id, String name) { this.id = id; this.name = name; } } class Student extends Person{ String course; int fee; public Student(int id, String name, String course, int fee) { super(id,name); this.course=course; this.fee=fee; } } public class SerializeISA { public static void main(String args[]) { try{ //Creating the object Student s1 =new Student(211,'ravi','Engineering',50000); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name+' '+s.course+' '+s.fee); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

תְפוּקָה:

 success 211 ravi Engineering 50000 

המחלקה SerializeISA סידרה את אובייקט הכיתה Student שמרחיב את המחלקה Person שהיא ניתנת להמשכה. מאפייני מחלקות האב עוברים בירושה לתת-מחלקות כך שאם מחלקת האב ניתנת להסדרה, תת-מחלקה תהיה גם כן.

Java Serialization with Aggregation (HAS-A Relationship)

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

Address.java

שורה מול עמודה
 class Address{ String addressLine,city,state; public Address(String addressLine, String city, String state) { this.addressLine=addressLine; this.city=city; this.state=state; } } 

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; Address address;//HAS-A public Student(int id, String name) { this.id = id; this.name = name; } } 

מכיוון שכתובת אינה ניתנת להמשכה, אינך יכול לעשות סדרה של המופע של כיתת Student.

הערה: כל האובייקטים בתוך אובייקט חייבים להיות ניתנים לסריאליזציה.

Java Serialization עם חבר הנתונים הסטטיים

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

Employee.java

 class Employee implements Serializable{ int id; String name; static String company='SSS IT Pvt Ltd';//it won't be serialized public Student(int id, String name) { this.id = id; this.name = name; } } 

Java Serialization עם מערך או אוסף

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

ניתן להחצנה ב-java

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

הממשק להחצנה מספק שתי שיטות:

    public void writeExternal(ObjectOutput out) זורק את IOException public void readExternal(ObjectInput in) זורק את IOException

מילת מפתח חולפת של Java

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

Employee.java

 class Employee implements Serializable{ transient int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

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

בקר בעמוד הבא לפרטים נוספים.

SerialVersionUID

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

 private static final long serialVersionUID=1L; 

כעת, המחלקה להסדרה תיראה כך:

Employee.java

 import java.io.Serializable; class Employee implements Serializable{ private static final long serialVersionUID=1L; int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } }