This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
java:object_serialization [2020/03/09 21:27] gthanos |
java:object_serialization [2020/05/22 11:36] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Object Serialization/ | ||
| - | Η Java παρέχει την δυνατότητα μετατροπής ενός αντικειμένου σε μία σειρά από bytes, προκειμένου αυτό στη συνέχεια να αποθηκευτεί σε ένα μέσω μόνιμης αποθήκευσης (π.χ. αρχείο στο filesystem) ή να μεταδοθεί μέσω δικτύου προκειμένου να δημιουργηθεί ένα αντίγραφο του σε απομακρυσμένο σημείο. Η διαδικασία μετατροπής των αντικειμένων σε bytes ονομάζεται **object serialization**. | ||
| - | |||
| - | Αφού ένα αντικείμενο μετατραπεί σε σειρά από bytes μπορούμε να ακολουθήσουμε την αντίστροφη διαδικασία προκειμένου να δημιουργήσουμε ένα αντίγραφο του αντικειμένου. Η διαδικασία " | ||
| - | |||
| - | Οι κλάσεις **[[http:// | ||
| - | |||
| - | Από τις μεθόδους της κλάσης **[[http:// | ||
| - | <code java> | ||
| - | public final void writeObject(Object obj) throws IOException | ||
| - | Parameters: | ||
| - | obj - the object to be written | ||
| - | Throws: | ||
| - | InvalidClassException - Something is wrong with a class used by serialization. | ||
| - | NotSerializableException - Some object to be serialized does not implement the java.io.Serializable interface. | ||
| - | IOException - Any exception thrown by the underlying OutputStream. | ||
| - | </ | ||
| - | |||
| - | Αντίστοιχα από τις μεθόδους της κλάσης **[[http:// | ||
| - | |||
| - | <code java> | ||
| - | public final Object readObject() throws IOException, | ||
| - | Returns: | ||
| - | the object read from the stream | ||
| - | Throws: | ||
| - | ClassNotFoundException - Class of a serialized object cannot be found. | ||
| - | InvalidClassException - Something is wrong with a class used by serialization. | ||
| - | StreamCorruptedException - Control information in the stream is inconsistent. | ||
| - | OptionalDataException - Primitive data was found in the stream instead of objects. | ||
| - | IOException - Any of the usual Input/ | ||
| - | </ | ||
| - | |||
| - | Απαραίτητη προϋπόθεση για το serialization/ | ||
| - | - η κλάση του αντικειμένου να υλοποιεί το // | ||
| - | - όλα τα πεδία της κλάσης να υλοποιούν το // | ||
| - | |||
| - | Όλοι οι βασικοί (primitive) τύποι δεδομένων κατά την διαδικασία του serialization μετατρέπονται σε αναφορικούς τύπους. Οι αναφορικοί τύποι Integer, Long, Double, Float, Character, Boolean και String είναι όλοι τύποι δεδομένων που υποστηρίζουν serialization. | ||
| - | |||
| - | ===== Παράδειγμα Serialization ===== | ||
| - | |||
| - | Θα επιχειρήσουμε να κάνουμε serialize ένα αντικείμενο της παρακάτω κλάσης Employee. | ||
| - | <code java Employee.java> | ||
| - | iimport java.util.*; | ||
| - | |||
| - | public class Employee implements java.io.Serializable { | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | |||
| - | | ||
| - | String str = "Name: " + name+" | ||
| - | str+=" | ||
| - | str+=" | ||
| - | str+=" | ||
| - | if(next != null) | ||
| - | str+=" | ||
| - | | ||
| - | if( list != null) { | ||
| - | Iterator< | ||
| - | if( it.hasNext() ) { | ||
| - | str+=" | ||
| - | } | ||
| - | while( it.hasNext() ) { | ||
| - | str+= it.next().name+", | ||
| - | } | ||
| - | str+=" | ||
| - | } | ||
| - | return str; | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Ας υποθέσουμε ότι κατασκευάζουμε δύο τέτοια αντικείμενα τα οποία τα μετατρέπουμε σε μία σειρά από bytes και τα αποθηκεύουμε στο αρχείο **employees.ser** (υποθέτουμε ότι έχετε την δυνατότητα να δημιουργήσετε το αρχείο στον τρέχοντα κατάλογο). Ο κώδικας μετατροπής και αποθήκευσης δίνεται παρακάτω: | ||
| - | |||
| - | <code java SerializeDemo.java> | ||
| - | import java.io.*; | ||
| - | import java.util.*; | ||
| - | public class SerializeDemo { | ||
| - | |||
| - | | ||
| - | Employee e = new Employee(); | ||
| - | e.name = "Vana Doufexi"; | ||
| - | e.address = " | ||
| - | e.AMKA = 11122333; | ||
| - | e.salary = 1000.9999; | ||
| - | | ||
| - | Employee e1 = new Employee(); | ||
| - | e1.name = " | ||
| - | e1.address = "28hs Septembriou & Glavani, Volos"; | ||
| - | e1.AMKA = 11122999; | ||
| - | e1.salary = 458.1234; | ||
| - | | ||
| - | e.next = e1; | ||
| - | e1.next = e; | ||
| - | | ||
| - | e.list = new ArrayList<> | ||
| - | e.list.add(e); | ||
| - | e.list.add(e1); | ||
| - | | ||
| - | e1.list = new ArrayList<> | ||
| - | e1.list.add(e); | ||
| - | e1.list.add(e1); | ||
| - | | ||
| - | try { | ||
| - | | ||
| - | new FileOutputStream(" | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | }catch(IOException ex) { | ||
| - | | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Μεταγλωττίστε και τρέξτε το πρόγραμμα και επιβεβαιώστε ότι δημιουργήθηκε το αρχείο **employees.ser**. | ||
| - | |||
| - | ===== Παράδειγμα Deserialization ===== | ||
| - | |||
| - | Ας υποθέσουμε ότι αφού αποθηκεύσαμε τα αντικείμενα στο αρχείο **employees.ser** θέλουμε να τα ανακτήσουμε ως λειτουργικά αντικείμενα σε ένα νέο πρόγραμμα. Ας δούμε το πρόγραμμα αυτό, το οποίο εκτυπώνει το περιεχόμενο τους με την βοήθεια της μεθόδου toString(). | ||
| - | |||
| - | <code java DeserializeDemo.java> | ||
| - | import java.io.*; | ||
| - | public class DeserializeDemo { | ||
| - | |||
| - | | ||
| - | Employee e, e1; | ||
| - | try { | ||
| - | | ||
| - | | ||
| - | e = (Employee) in.readObject(); | ||
| - | e1 = (Employee) in.readObject(); | ||
| - | | ||
| - | | ||
| - | }catch(IOException i) { | ||
| - | | ||
| - | | ||
| - | }catch(ClassNotFoundException ex) { | ||
| - | | ||
| - | | ||
| - | | ||
| - | } | ||
| - | | ||
| - | System.out.println(e); | ||
| - | System.out.println(e1); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | <WRAP todo 80% center round> | ||
| - | Στο παραπάνω παράδειγμα δηλώστε τα τελευταία τρία πεδία της κλάσης Employee ως transient, oπως παρακάτω. Μεταγλωττίστε και τρέξτε ξανά τις κλάσεις **SerializeDemo** και **DeserializeDemo**. Τι παρατηρείτε; | ||
| - | </ | ||
| - | |||
| - | <code java Employee.java> | ||
| - | import java.util.*; | ||
| - | |||
| - | public class Employee implements java.io.Serializable { | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | |||
| - | | ||
| - | String str = "Name: " + name+" | ||
| - | str+=" | ||
| - | str+=" | ||
| - | str+=" | ||
| - | if(next != null) | ||
| - | str+=" | ||
| - | | ||
| - | if( list != null) { | ||
| - | Iterator< | ||
| - | if( it.hasNext() ) { | ||
| - | str+=" | ||
| - | } | ||
| - | while( it.hasNext() ) { | ||
| - | str+= it.next().name+", | ||
| - | } | ||
| - | str+=" | ||
| - | } | ||
| - | return str; | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | |||
| - | |Προηγούμενο: | ||