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\
opera]ie se poate salva într-un fi[ier, ca [ir de octe]i, o instan]\ a unei clase, în orice moment al execu]iei. De asemenea, obiectul poate
fi restaurat din fi[ierul în care a fost salvat în urma unei opera]ii de serializare.
Salvarea datelor înapsulate într-un obiect se poate face [i prin salvarea pe rând 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 ap\rea probleme cum ar fi :
datele obiectului pot fi instan]e ale altor obiecte
Interfa]a Serialize nu are nici o metod\, ea d\ doar posibilitatea de a specifica faptul c\ se dore[te ca o anumit\ clas\ s\ poat\ fi
serializat\. Declara]ia unei astfel de clase ar fi :
class ClasaSerializabila implements Serializable {...}
In urma serializ\rii obiectele sunt pot fi salvatr într-un fi[ier, în acela[i fi[ier putând fi salvate [i mai multe obiecte. Opera]iile de intrare
ie[ire la nivelul obicetelor se realizeaz\ prin intermediul unor fluxuri de obiecte, implementate de clasele ObjectInputStream [i
ObjectOutputStream.
Restaurarea unui obiect salvat într-un fi[ier se face într-o manier\ asem\n\toare:
FileInputStream fin = new FileInputStream(“fisier”);
ObjectInputStream sin = new ObjectInputStream(fin);
o = (MyObject) sin.readObject();
Pe lâng\ metodele de scriere/citire a obiectelor cele dou\ clase pun la dispozi]ie [i metode pentru scrierea tipurilor de date primare,
astfel încât 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();
Clasa ObjectOutputStream
Constructor
1
Serializarea obiectelor
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
2
Serializarea obiectelor
Pentru ca un anumit câmp s\ nu fie salvat în urma serializ\rii, acesta trebuie declarat cu modificatorul transient. Aceste
câmpuri 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
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 când o clas\ serializabil\ deriv\ dintr-o alt\ clas\, salvarea câmpurilor clasei p\rinte se va face doar dac\ [i aceasta este
serializabil\. In caz contrar, subclasa trebuie s\ salveze explicit [i câmpurile mo[tenite.
Ex1:
class Parinte implements Serializable {
3
Serializarea obiectelor
int x;
...
}
class Fiu extends Parinte implements Serializable {
int y;
...
}
La serializare se salveaz\ atât x cât [i y.
Ex1:
class Parinte {
int x;
...
}
class Fiu extends Parinte implements Serializable {
int y;
...
}
Serializarea nu decurge normal.
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. Deficien]a
acestei metode este c\ nu func]ioneaz\ corect decât atunci când clasa clonat\ nu are câmpuri referin]\ c\tre alte obiecte, obiectele
referite nemaifiind copiate la rândul lor.
O metod\ clone() care s\ realizeze o copie efectiv\ a unui obiect, împreun\ cu copierea tuturor obiectelor referite de
câmpurile acelui obiect poate fi implementat\ prin mecanismul serializ\rii astfel :
catch (Exception e) {
System.out.println(e);
return null;
}
}