java:object_serialization

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 | Παραμετρικοί τύποι δεδομένων ]] |
  
  
java/object_serialization.1487338736.txt.gz · Last modified: 2017/02/17 13:38 by gthanos