La Serializzazione in Java L24_Serialization 1 La Serialization è la trasformazione di un oggetto in memoria in una sequenza di byte (ospitata in un file, trasmessa in rete, ecc). La Deserialization è il processo inverso In java la serialization è possibile per gli oggetti che implentano l'interfaccia Serializable, che è una interfaccia “marker” (non c'e' alcun metodo da implementare, come “Clonable”) L24_Serialization 2 ● La Serializzazione si ottiene con la classe ObjectOutputStream (metodo writeObject), mentre la deserializzazione si ottiene con ObjectInputStream (metodo readObject). ESEMPIO FileOutputStream out = new FileOutputStream( “test.ser” ); ObjectOutputStream oos = new ObjectOutputStream( out ); oos.writeObject( new Date() ); oos.writeInt(12345);//== ser. Di tipi prim. oos.close(); L24_Serialization 3 Se l'oggetto da serializzare possiede referenze ad altri oggetti (o array), anche questi oggetti vengono serializzati (Object Graph). L' Object Graph consiste nell'oggetto serializzato e da ogni altro oggetto o array di cui l'oggetto ha referenze dirette o indirette. L24_Serialization 4 Transient e static Un campo classificato come transient, nella fase di deserializzazione vengono ripristinati ai loro valori defualt (I campi numerici transient vengono ripristinati a zero). I campi static non vengono serializzati L24_Serialization 5 L'interfaccia Externalizable La Serializzazione la deserializazzione possono essere implementati riscrivendo I metodi writeObject e readObject. L'interfaccia Externalizable puo' essere implementata da classi che devono avere un controllo completo sulla serializzazione e sulla deserializzazione. Il meccanismo di de-serializzazione invoca il costruttore default (senza argomenti) quando ripristina gli oggetti. L24_Serialization 6 import java.io.*; import java.util.*; public class test { public static void main (String args[]) throws IOException, ClassNotFoundException { ObjectOutputStream out=new ObjectOutputStream (new FileOutputStream("objects.dat")); Date now = new Date(System.currentTimeMillis()); out.writeObject(now); out.close(); System.out.println("I have written:"); System.out.println("A Date object: "+now); ObjectInputStream in = new ObjectInputStream ( new FileInputStream("objects.dat")); Date d1 = (Date)in.readObject(); System.out.println("I have read:"); System.out.println("A Date object: "+d1); } } L24_Serialization 7 import java.io.*; public class Login implements Serializable { private String user; private transient String password; public Login() {} public Login (String u, String p) { user = u; password = p; } public void printout () { if (user != null) System.out.println ("User name is: "+user); else System.out.println ("User name not defined"); if (password != null) System.out.println ("Password is: "+password); else System.out.println ("Password not defined"); } } L24_Serialization 8 import java.io.*; public class MyApplication { public static void main (String[] args) throws IOException, ClassNotFoundException { Login l1 = new Login("teacher", "class99java"); System.out.println ("This is the object created in memory"); l1.printout(); ObjectOutputStream out = new ObjectOutputStream ( new FileOutputStream ("login.dat")); out.writeObject(l1); out.close(); // We crate another login object from the stored one ObjectInputStream in = new ObjectInputStream ( new FileInputStream ("login.dat")); Login l2 = (Login)in.readObject(); System.out.println("This is the object created from serialization"); l2.printout(); in.close(); } } L24_Serialization 9 import java.io.*; public class Blip implements Externalizable { int i; String s; public Blip() { System.out.println("Blip's default constructor"); i=0; s=""; } public Blip (String x, int a) { System.out.println("Blip's constructor with data"); s=x;i=a; } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { s = (String)in.readObject(); } public void writeExternal (ObjectOutput out) throws IOException { out.writeObject(s); } public void printout() { System.out.println ("This blip has an int: "+i); System.out.println ("This blip has a string: "+s); } } import java.io.*; public class SerializeOutBlips { public static void main (String args[]) throws IOException { Blip b = new Blip ("Hello class", 21); b.printout(); ObjectOutputStream out = new ObjectOutputStream ( new FileOutputStream ("blips.dat")); out.writeObject(b); out.close(); } L24_Serialization } import java.io.*; 10