0% au considerat acest document util (0 voturi)
19 vizualizări6 pagini

Serializarea Curs Java

Încărcat de

Razvan Juretcu
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
19 vizualizări6 pagini

Serializarea Curs Java

Încărcat de

Razvan Juretcu
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd

Serializarea obiectelor

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 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 ap\rea probleme cum ar fi : datele obiectului pot fi instan]e ale altor obiecte n unele cazuri, este necesar\ [i salvarea tipului datei unele cmpuri fac referin]\ la acela[i obiect A[adar, prin serializare sunt surprinse att datele, signatura clasei (numele metodelor [i defini]ia 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 interfe]ele : - [Link] sau - [Link] (care extinde clasa Serializable) 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 putnd 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. Salvarea unui obiect ntr-un fi[ier se realizeaz\ astfel :
MyObject o = new MyObject(); FileOutputStream fout = new FileOutputStream(fisier); ObjectOutputStream sout = new ObjectOutputStream(fout); [Link](o);

Serializarea obiectelor

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) [Link]();

Pe lng\ metodele de scriere/citire a obiectelor cele dou\ clase pun la dispozi]ie [i metode pentru scrierea tipurilor de date primare, astfel nct apeluri ca cele de mai jos sunt permise :
FileOutputStream ostream = new FileOutputStream("[Link]"); ObjectOutputStream p = new ObjectOutputStream(ostream); [Link](12345); [Link]("Today"); [Link](new Date()); [Link](); [Link](); FileInputStream istream = new FileInputStream("[Link]"); ObjectInputStream p = new ObjectInputStream(istream); int i = [Link](); String today = (String)[Link](); Date date = (Date)[Link](); [Link]();

ObjectInputStream [i ObjectOutputStream implementeaz\ indirect interfe]ele DataInput, respectiv DataOutput, interef]e ce declar\ metode

att pentru scrierea/citirea datelor primitive, ct [i pentru scrierea/citirea obiectelor. Pentru transferul obiectelor sunt folosite metodele:
final void writeObject( [Link] obj ) throws [Link] final [Link] readObject( ) throws [Link], [Link], [Link]

Acestea apeleaz\ la rndul lor metodele implicte de transfer defaultWriteObject [i defaultReadObject (avnd acelea[i signaturi ca mai sus) Clasa ObjectOutputStream Constructor

public ObjectOutputStream( [Link] out ) throws [Link]

Metode
void close( ) throws [Link] final void defaultWriteObject( ) throws [Link] void flush( ) throws [Link] void reset( ) throws [Link] void write( byte[] b ) throws [Link]

Serializarea obiectelor void write( byte[] b, int off, int len ) throws [Link] void void void void void void void void void void write( int data ) throws [Link] writeBoolean( boolean data ) throws [Link] writeByte( int data ) throws [Link] writeBytes( [Link] data ) throws [Link] writeChar( int data ) throws [Link] writeChars( [Link] data ) throws [Link] writeDouble( double data ) throws [Link] writeFloat( float data ) throws [Link] writeInt( int data ) throws [Link] writeLong( long data ) throws [Link]

final void writeObject( [Link] obj ) throws [Link] void writeShort( int data ) throws [Link] void writeUTF( [Link] data ) throws [Link]

Clasa ObjectInputStream Constructor


public ObjectInputStream( [Link] in ) throws [Link], [Link] 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
int available( ) throws [Link] void close( ) throws [Link] final void defaultReadObject( ) throws [Link], [Link], [Link] int read( byte[] data, int offset, int length ) throws [Link] int read( ) throws [Link] boolean readBoolean( ) throws [Link] byte readByte( ) throws [Link] char readChar( ) throws [Link] double readDouble( ) throws [Link] float readFloat( ) throws [Link] void readFully( byte[] data ) throws [Link] void readFully( byte[] data, int offset, int size ) throws [Link] int readInt( ) throws [Link] [Link] readLine( ) throws [Link] long readLong( ) throws [Link] final [Link] readObject( ) throws [Link], [Link], [Link] short readShort( ) throws [Link] int readUnsignedByte( ) throws [Link] int readUnsignedShort( ) throws [Link]

Serializarea obiectelor [Link] readUTF( ) throws [Link] ynchronized void registerValidation( [Link] obj, int prio ) throws [Link], [Link] int skipBytes( int len ) throws [Link]

Cuvintul cheie transient Pentru ca un anumit cmp s\ nu fie salvat n urma serializ\rii, 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 [Link].*; public class TestSerial { static MyObject obj; public static void main(String args[]) { obj = new MyObject(10,20); try { FileOutputStream fout = new FileOutputStream("[Link]"); ObjectOutputStream sout = new ObjectOutputStream(fout); [Link](obj); [Link](); [Link](); [Link](); [Link]("A fost salvat obiectul " + obj); } catch (IOException e) {} [Link]("Restauram..."); try { FileInputStream fin = new FileInputStream("[Link]"); ObjectInputStream sin = new ObjectInputStream(fin); try { obj = (MyObject) [Link](); } catch (ClassNotFoundException e) {} [Link](); [Link](); [Link]("A fost restaurat obiectul " + obj); } catch (IOException e) {} } } class MyObject implements Serializable { int x; private transient int y;

Serializarea obiectelor public MyObject(int x, int y) { this.x = x; this.y = y; } public String toString() { return new String("x=" + x + ", y="+y); } }

Rezultatul acestui program va fi :

A fost salvat obiectul x=10, y=20 Restauram... A fost restaurat obiectul x=10, y=0

Obs. Atunci cnd o clas\ serializabil\ deriv\ dintr-o alt\ clas\, salvarea cmpurilor clasei p\rinte se va face doar dac\ [i aceasta este serializabil\. In caz contrar, subclasa trebuie s\ salveze explicit [i cmpurile mo[tenite. 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. Folosirea serializ\rii pentru copierea obiectelor Se [tie c\ nu putem copia un obiect prin instruc]iunea de atribuire. O secven]\ de forma:

MyObject o1 = new MyObject(10, 20); MyObject o2 = o1; nu face dect s\ declare obiectul o2 ca fiind o referin]\ la obiectul o1. Orice

schimbare ntr-unul din cele dou\ obiecte se va reflecta [i n cel\lalt.


o1 o2

Serializarea 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) [Link]();
o1 date referin]\ o2 date(copie)

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 dect atunci cnd clasa clonat\ nu are cmpuri referin]\ c\tre 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 serializ\rii astfel :
public Object clone() { try { ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bout); [Link](this); [Link](); ByteArrayInputStream bin = new ByteArrayInputStream(); ObjectInputStream in = new ObjectInputStream(bin); Object ret = [Link](); [Link](); return ret; } catch (Exception e) { [Link](e); return null; } }

S-ar putea să vă placă și