Documente Academic
Documente Profesional
Documente Cultură
Serializarea obiectelor
Serializarea este o metod prin care se pot salva, ntr-o manier unitar, datele mpreun cu
signatura unui obiect. Folosind aceast operaie se poate salva ntr-un fiier, ca ir de octei, o
instan a unei clase, n orice moment al execuiei. De asemenea, obiectul poate fi restaurat din
fiierul n care a fost salvat n urma unei operaii de serializare.
Salvarea datelor napsulate ntr-un obiect se poate face i prin salvarea pe rnd a datelor,
folosind clasa DataOutputStream, pentru ca apoi s fie restaurate prin metode ale clasei
DataInputStream, dar o asemenea abordare nu este n general suficient, deoarece pot aprea
probleme cum ar fi :
datele obiectului pot fi instane ale altor obiecte
n unele cazuri, este necesar i salvarea tipului datei
unele cmpuri fac referin la acelai obiect
Aadar, prin serializare sunt surprinse att datele, signatura clasei (numele metodelor i
definiia lor - nu i implementarea) precum i starea obiectului.
Pentru a putea fi serializat un obiect trebuie s fie instan a unei clase care implementeaz
una din interfeele :
- java.io.Serializable sau
- java.io.Externalizable (care extinde clasa Serializable)
Interfaa Serialize nu are nici o metod, ea d doar posibilitatea de a specifica faptul c se dorete
ca o anumit clas s poat fi serializat. Declaraia unei astfel de clase ar fi :
class ClasaSerializabila implements Serializable {...}
In urma serializrii obiectele sunt pot fi salvatr ntr-un fiier, n acelai fiier putnd fi salvate i mai
multe obiecte. Operaiile de intrare ieire la nivelul obicetelor se realizeaz prin intermediul unor
fluxuri de obiecte, implementate de clasele ObjectInputStream i ObjectOutputStream.
Restaurarea unui obiect salvat ntr-un fiier se face ntr-o manier asemntoare:
FileInputStream fin = new FileInputStream(fisier);
ObjectInputStream sin = new ObjectInputStream(fin);
o = (MyObject) sin.readObject();
Pe lng metodele de scriere/citire a obiectelor cele dou clase pun la dispoziie i metode pentru
scrierea tipurilor de date primare, astfel nct apeluri ca cele de mai jos sunt permise :
FileOutputStream ostream = new FileOutputStream("t.tmp");
ObjectOutputStream p = new ObjectOutputStream(ostream);
p.writeInt(12345);
p.writeObject("Today");
p.writeObject(new Date());
p.flush();
ostream.close();
1
Serializarea obiectelor
Clasa ObjectOutputStream
Constructor
public ObjectOutputStream( java.io.OutputStream out )
throws java.io.IOException
Metode
Clasa ObjectInputStream
Constructor
Create an ObjectInputStream that reads from the specified InputStream. The stream header
containing the magic number and version number are read from the stream and verified. This
method will block until the corresponding ObjectOutputStream has written and flushed the header.
Metode
Pentru ca un anumit cmp s nu fie salvat n urma serializrii, acesta trebuie declarat cu
modificatorul transient. Aceste cmpuri vor fi ignorate de metodele writeObject i readObject.
Ex:
private transient x; ignorat la serializare
Exemplu:
import java.io.*;
catch (IOException e) {}
System.out.println("Restauram...");
try {
FileInputStream fin = new
3
Serializarea obiectelor
FileInputStream("fisier.tmp");
ObjectInputStream sin = new ObjectInputStream(fin);
try {
obj = (MyObject) sin.readObject();
}
catch (ClassNotFoundException e) {}
sin.close();
fin.close();
System.out.println("A fost restaurat obiectul " + obj);
}
catch (IOException e) {}
}
}
Obs. Atunci cnd o clas serializabil deriv dintr-o alt clas, salvarea cmpurilor clasei printe
se va face doar dac i aceasta este serializabil. In caz contrar, subclasa trebuie s salveze
explicit i cmpurile motenite.
Ex1:
class Parinte implements Serializable {
int x;
...
}
class Fiu extends Parinte implements Serializable {
int y;
...
}
La serializare se salveaz att x ct i y.
Ex1:
class Parinte {
int x;
...
}
class Fiu extends Parinte implements Serializable {
int y;
...
}
Serializarea nu decurge normal.
4
Serializarea obiectelor
Folosirea serializrii pentru copierea obiectelor
date
O posibilitate de a face o copie unui obiect este folosirea metodei clone() a clasei Object.
MyObject o1 = new MyObject(10, 20);
MyObject o2 = (MyObject) o1.clone();
o1 o2
date date(copie)
referin
Conversia la clasa MyObject este necesar deoarece metoda clone() returneaz un obiect de
tip Object. Deficiena acestei metode este c nu funcioneaz corect dect atunci cnd clasa
clonat nu are cmpuri referin ctre alte obiecte, obiectele referite nemaifiind copiate la rndul
lor.
O metod clone() care s realizeze o copie efectiv a unui obiect, mpreun cu copierea
tuturor obiectelor referite de cmpurile acelui obiect poate fi implementat prin mecanismul
serializrii astfel :
catch (Exception e) {
System.out.println(e);
return null;
}
}