Documente online.
Username / Parola inexistente
  Zona de administrare documente. Fisierele tale  
Am uitat parola x Creaza cont nou
  Home Exploreaza
Upload




























Serializarea obiectelor

Informatica




Serializarea obiectelor

Facilitatile legate de serializare/deserializare apar în pachetul java.io




Necesitatea serializarii si deserializarii obiectelor

În multe situatii apare necesitatea ca unul sau mai multe obiecte sa poata fi memorate pentru a fi folos 828t1923i ite si dupa încheierea aplicatiei care le-a creat. Pentru aceasta starea lor trebuie salvata într-un mod care sa permita refacerea lor ulterioara. Java ofera mecanismele de serializare si deserializare, care realizeaza tocmai salvarea, respectiv refacerea obiectelor. Una dintre aplicatiile evidente ale acestor mecanisme consta în serializarea obiectelor pe un sistem, urmata de transmiterea lor la distanta si deserializarea lor pe o noua masina gazda pentru a fi folosite în continuare.

Serializarea consta în memorarea, într-un anumit format, a starii obiectelor într-un tablou de octeti sau într-un fisier. Acestea au un caracter serial: pot accepta numai secvente de octeti. De aici deriva denumirile de serializare/deserializare. Mai este evident ca vor fi folosite operatii de intrare/iesire la nivel de octet.

Facilitatea ca obiectele sa poata "supravietui" si dupa teminarea executarii programului care le-a creat se mai numeste persistenta datelor.

În cele ce urmeaza ne vom îndrepta atentia în special asupra fisierelor ca fluxuri pentru salvarea/restaurarea obiectelor.

În exemplele care urmeaza vor presupune ca serializarea se va face în cadrul unui director, iar deserializarea se va realiza din alt director. Ele vor fi numite ad-hoc director sursa si director destinatie si nu sunt neaparat distincte.

Un prim exemplu

Exemplul 1. Directorul sursa contine clasa Angajat

import java.io.*;

public class Angajat implements Serializable

public void print()

si clasa Serial1

import java.io.*;

public class Serial1

Facem deocamdata abstractie de continutul comentariilor de sfârsit de linie.

Clasa ObjectOutputStream extinde clasa abstracta OutputStream. Prin invocarea metodei writeObject se realizeaza serializarea (într-un mod standard) a obiectelor create si scrierea rezultatului serializarii în fluxul de iesire.

Clasa Angajat implementeaza interfata Serializable. Prin abuz de limbaj vom numi clasa serializabila o clasa ce implementeaza aceasta interfata. Sa retinem ca numai instantele unei clase serializabile pot fi serializate.

Mai observam ca un flux de serializare poate contine mai multe obiecte.

Presupunem în continuare ca în directorul destinatie apar (de exemplu au fost copiate) fisierele Angajat si Serial, precum si urmatoarea clasa, al carei nume este tot Serial

import java.io.*;

public class Serial2

Clasa ObjectInputStream extinde clasa abstracta InputStream. Prin invocarea metodei readObject se realizeaza deserializarea (într-un mod standard) a obiectelor din fluxul de intrare.

Metoda readObject întoarce un obiect de tipul Object, ceea ce face necesara conversia explicita la tipul Angajat

Sa observam ca la iesire, în dreptul numelui firmei apare null. Aceasta se datoreaza faptului ca în mecanismul de serializare nu sunt incluse si câmpurile statice. Explicatia consta în aceea ca serializarea se refera la obiecte, iar câmpurile statice sunt variabile de clasa.

Daca comentariile de sfârsit de linie din clasele de mai sus devin instructiuni efective, atunci si câmpul static firma va fi inclus în procesul de serializare. Drept urmare, la iesire va aparea si numele firmei.

Un câmp declarat cu transient acest modificator nu va fi inclus în procesul de serializare. Aceasta corespunde de exemplu situatiei în care la deserializare el nu mai este folosit. Daca pentru un anumit obiect dorim totusi sa transmitem si acest câmp, va trebui sa o facem explicit, la fel ca pentru câmpurile statice.

Ce se transmite la serializare?

Raspundem partial, mentionând ca nu sunt transmise:

- câmpurile statice si cele cu modificatorul transient

- corpurile metodelor: este transmisa numai signatura lor.

Exemplul 2. Serializam un obiect al urmatoarei clase:

import java.io.*;

public class UnuC implements Serializable

void print()

Daca la deserializare în directorul destinatie în metoda print a clasei UnuC înlocuim (x+y) prin (x*y), iar obiectul de tipul UnuC obtinut prin deserializare invoca aceasta metoda, la iesire va aparea produsul (si nu suma) celor doua câmpuri.



Întrebare: Câte obiecte sunt serializate la serializarea unui obiect?

Intervine notiunea de graf asociat unui obiect. Graful asociat unui obiect consta din obiectul respectiv, dar si din obiectele referite direct sau indirect de el.

La serializarea unui obiect este serializat întregul graf asociat obiectului respectiv. Aceasta facilitate este foarte utila si este ilustrata în continuare.

Exemplul 3. Serializarea unei liste circulare.

Directorul sursa contine clasa element

import java.io.*;

class element implements Serializable

element(char ch)

void creare()

u.leg = p;

}

element adaug(char ch)

String parcurg(element x)

precum si clasa Lista1

import java.io.*;

public class Lista1

Metoda principala a clasei Lista1 construieste o lista înlantuita circulara formata din caracterele citite de la intrare pâna la întâlnirea caracterului . Capul listei apare în câmpul static p al clasei elem. La serializarea lui p sunt de fapt serializate toate elemetele (obiectele) din lista, adica întreg graful asociat acestui obiect.

Într-adevar, daca în directorul destinatie includem clasa element si urmatoarea clasa Lista2

import java.io.*;

public class Lista2

atunci la executarea metodei principale vor fi listate toate elementele listei.

Exemplul de mai sus arata ca serializarea "nu se încurca" daca un obiect din graful asociat se autorefera. Sa mentionam ca în acest caz mecanismul de serializare "memoreaza" o singura data un astfel de obiect.

Interfete si clase folosite la serializare/deserializare

Interfata Serializable

public interface Serializable

Interfata nu are nici metode, nici câmpuri. Rolul sau este de a autoriza serializarea si deserializarea instantelor sale.

Clasele ce extind aceasta interfata sunt automat serializabile. La serializarea grafului asociat unui obiect, daca un obiect din acest graf nu este serializabil, atunci va fi lansata exceptia NotSerializableException

Clasa ObjectOutputStream

public class ObjectOutputStream extends OutputStream

implements DataOutput,ObjectOutput

Un flux de iesire ce instantiaza aceasta clasa permite scrierea de date primitive si de grafuri asociate unor obiecte într-un mod standard, care permite reconstituirea lor folosind metodele clasei ObjectInputStream

Clasa ObjectInputStream

public class ObjectInputStream extends InputStream

implements DataInput, ObjectInput

La deserializare sunt alocate noi adrese, prevenindu-se astfel scrierea peste obiecte existente. Drept urmare, serializarea si deserializarea pot fi realizate în cadrul aceluiasi program, fara "pericolul" ca obiectul serializat si cel obtinut prin deserializare sa aiba aceeasi adresa.

La invocarea metodelor writeObject si readObject pentru un obiect se verifica daca obiectul ce trebuie serializat/deserializat este o instanta a unei clase ce contine aceste metode. În caz afirmativ, se întreprind actiunile de mai sus, iar în caz contrar se întreprinde actiunea standard.










Document Info


Accesari: 4226
Apreciat:

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site

Copiaza codul
in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate




Copyright © Contact (SCRIGROUP Int. 2021 )