La Serializzazione in Java - Digilander

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