This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
java:object_serialization [2017/02/17 13:38] gthanos |
java:object_serialization [2017/02/17 14:11] (current) gthanos |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Object Serialization ====== | + | ====== Object Serialization/Deserialization ====== |
Η Java παρέχει την δυνατότητα μετατροπής ενός αντικειμένου σε μία σειρά από bytes, προκειμένου αυτό στη συνέχεια να αποθηκευτεί σε ένα μέσω μόνιμης αποθήκευσης (π.χ. αρχείο στο filesystem) ή να μεταδοθεί μέσω δικτύου προκειμένου να δημιουργηθεί ένα αντίγραφο του σε απομακρυσμένο σημείο. Η διαδικασία μετατροπής των αντικειμένων σε bytes ονομάζεται **object serialization**. | Η Java παρέχει την δυνατότητα μετατροπής ενός αντικειμένου σε μία σειρά από bytes, προκειμένου αυτό στη συνέχεια να αποθηκευτεί σε ένα μέσω μόνιμης αποθήκευσης (π.χ. αρχείο στο filesystem) ή να μεταδοθεί μέσω δικτύου προκειμένου να δημιουργηθεί ένα αντίγραφο του σε απομακρυσμένο σημείο. Η διαδικασία μετατροπής των αντικειμένων σε bytes ονομάζεται **object serialization**. | ||
Line 42: | Line 42: | ||
Θα επιχειρήσουμε να κάνουμε serialize ένα αντικείμενο της παρακάτω κλάσης Employee. | Θα επιχειρήσουμε να κάνουμε serialize ένα αντικείμενο της παρακάτω κλάσης Employee. | ||
<code java Employee.java> | <code java Employee.java> | ||
- | import java.util.*; | + | iimport java.util.*; |
public class Employee implements java.io.Serializable { | public class Employee implements java.io.Serializable { | ||
Line 57: | Line 57: | ||
str+="AMKA: " + AMKA+"\n"; | str+="AMKA: " + AMKA+"\n"; | ||
str+="Salary: " + salary+"\n"; | str+="Salary: " + salary+"\n"; | ||
- | str+="Next: " + next.name+"\n"; | + | if(next != null) |
- | Iterator<Employee> it = list.iterator(); | + | str+="Next: " + next.name+"\n"; |
- | if( it.hasNext() ) { | + | |
- | str+="List: "; | + | if( list != null) { |
- | } | + | Iterator<Employee> it = list.iterator(); |
- | while( it.hasNext() ) { | + | if( it.hasNext() ) { |
- | str+= it.next().name+", "; | + | str+="List: "; |
+ | } | ||
+ | while( it.hasNext() ) { | ||
+ | str+= it.next().name+", "; | ||
+ | } | ||
+ | str+="\n"; | ||
} | } | ||
- | str+="\n"; | ||
return str; | return str; | ||
} | } | ||
Line 73: | Line 77: | ||
Ας υποθέσουμε ότι κατασκευάζουμε δύο τέτοια αντικείμενα τα οποία τα μετατρέπουμε σε μία σειρά από bytes και τα αποθηκεύουμε στο αρχείο **employees.ser** (υποθέτουμε ότι έχετε την δυνατότητα να δημιουργήσετε το αρχείο στον τρέχοντα κατάλογο). Ο κώδικας μετατροπής και αποθήκευσης δίνεται παρακάτω: | Ας υποθέσουμε ότι κατασκευάζουμε δύο τέτοια αντικείμενα τα οποία τα μετατρέπουμε σε μία σειρά από bytes και τα αποθηκεύουμε στο αρχείο **employees.ser** (υποθέτουμε ότι έχετε την δυνατότητα να δημιουργήσετε το αρχείο στον τρέχοντα κατάλογο). Ο κώδικας μετατροπής και αποθήκευσης δίνεται παρακάτω: | ||
- | <code java> | + | <code java SerializeDemo.java> |
import java.io.*; | import java.io.*; | ||
import java.util.*; | import java.util.*; | ||
Line 119: | Line 123: | ||
Μεταγλωττίστε και τρέξτε το πρόγραμμα και επιβεβαιώστε ότι δημιουργήθηκε το αρχείο **employees.ser**. | Μεταγλωττίστε και τρέξτε το πρόγραμμα και επιβεβαιώστε ότι δημιουργήθηκε το αρχείο **employees.ser**. | ||
+ | |||
+ | ===== Παράδειγμα Deserialization ===== | ||
+ | |||
+ | Ας υποθέσουμε ότι αφού αποθηκεύσαμε τα αντικείμενα στο αρχείο **employees.ser** θέλουμε να τα ανακτήσουμε ως λειτουργικά αντικείμενα σε ένα νέο πρόγραμμα. Ας δούμε το πρόγραμμα αυτό, το οποίο εκτυπώνει το περιεχόμενο τους με την βοήθεια της μεθόδου toString(). | ||
+ | |||
+ | <code java DeserializeDemo.java> | ||
+ | import java.io.*; | ||
+ | public class DeserializeDemo { | ||
+ | |||
+ | public static void main(String [] args) { | ||
+ | Employee e, e1; | ||
+ | try { | ||
+ | FileInputStream fileIn = new FileInputStream("employees.ser"); | ||
+ | ObjectInputStream in = new ObjectInputStream(fileIn); | ||
+ | e = (Employee) in.readObject(); | ||
+ | e1 = (Employee) in.readObject(); | ||
+ | in.close(); | ||
+ | fileIn.close(); | ||
+ | }catch(IOException i) { | ||
+ | i.printStackTrace(); | ||
+ | return; | ||
+ | }catch(ClassNotFoundException ex) { | ||
+ | System.out.println("Employee class not found"); | ||
+ | ex.printStackTrace(); | ||
+ | return; | ||
+ | } | ||
+ | | ||
+ | System.out.println(e); | ||
+ | System.out.println(e1); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | <WRAP todo 80% center round> | ||
+ | Στο παραπάνω παράδειγμα δηλώστε τα τελευταία τρία πεδία της κλάσης Employee ως transient, oπως παρακάτω. Μεταγλωττίστε και τρέξτε ξανά τις κλάσεις **SerializeDemo** και **DeserializeDemo**. Τι παρατηρείτε; | ||
+ | </WRAP> | ||
+ | |||
+ | <code java Employee.java> | ||
+ | import java.util.*; | ||
+ | |||
+ | public class Employee implements java.io.Serializable { | ||
+ | public String name; | ||
+ | public String address; | ||
+ | public int AMKA; | ||
+ | public transient double salary; | ||
+ | public transient Employee next; | ||
+ | public transient ArrayList<Employee> list; | ||
+ | |||
+ | public String toString() { | ||
+ | String str = "Name: " + name+"\n"; | ||
+ | str+="Address: " + address+"\n"; | ||
+ | str+="AMKA: " + AMKA+"\n"; | ||
+ | str+="Salary: " + salary+"\n"; | ||
+ | if(next != null) | ||
+ | str+="Next: " + next.name+"\n"; | ||
+ | | ||
+ | if( list != null) { | ||
+ | Iterator<Employee> it = list.iterator(); | ||
+ | if( it.hasNext() ) { | ||
+ | str+="List: "; | ||
+ | } | ||
+ | while( it.hasNext() ) { | ||
+ | str+= it.next().name+", "; | ||
+ | } | ||
+ | str+="\n"; | ||
+ | } | ||
+ | return str; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |Προηγούμενο: [[ :java:write_to_file | Γράφοντας σε αρχείο ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:generics | Παραμετρικοί τύποι δεδομένων ]] | | ||