- סדרה
- ממשק שניתן לסידרה
- דוגמה לסריאליזציה
- דוגמה לדה-סריאליזציה
- סדרה עם ירושה
- ממשק להחצנה
- סריאליזציה וחבר נתונים סטטיים
סדרה ב-Java הוא מנגנון של כתיבת מצב של אובייקט לתוך זרם בתים . הוא משמש בעיקר בטכנולוגיות Hibernate, RMI, JPA, EJB ו-JMS.
הפעולה ההפוכה של סריאליזציה נקראת דה-סריאליזציה שבו זרם בתים מומר לאובייקט. תהליך ההמשכה והדה-סריאליזציה הוא בלתי תלוי בפלטפורמה, זה אומר שאתה יכול לעשות סדרה של אובייקט על פלטפורמה אחת ולבטל אותו על פלטפורמה אחרת.
עבור הסדרת האובייקט, אנו קוראים את writeObject() שיטה של ObjectOutputStream מחלקה, ולצורך דה-סריאליזציה אנו קוראים את readObject() שיטה של ObjectInputStream מעמד.
אנחנו חייבים ליישם את ניתן להסדרה ממשק לסידור האובייקט.
היתרונות של Java Serialization
הוא משמש בעיקר כדי להעביר את מצב האובייקט ברשת (המכונה מרשלינג).
ממשק 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 מספק את המאפשר לכתוב את המצב של אובייקט לתוך זרם בתים בפורמט דחיסה. זה לא ממשק סמן.
הממשק להחצנה מספק שתי שיטות:
מילת מפתח חולפת של 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; } }