Documente Academic
Documente Profesional
Documente Cultură
Serializare
11/26/07
Ce este serializarea?
Serializarea este procesul prin care convertim un obiect intr-o secventa liniara de bytes (octeti) care poate fi stocata sau transferata. Deserializarea este procesul invers serializarii.
11/26/07
Ce este serializarea?
11/26/07
PAS1: Cream un stream spre care vom directiona serializarea. PAS2: Cream un obiect BinaryFormatter PAS3: Folosim metoda BinaryFormatter.Serialize
ex: string data = data de salvat; FileStream fs = new FileStream (data.out, FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs,data); fs.Close();
11/26/07 L3 .NET ADF - (C) Victor Adrian Prisacariu
PAS1: Cream un stream din care vom citi PAS2: Cream un obiect BinaryFormatter PAS3: Cream un obiect in care vom salva datele deserializate PAS4: Apelam metoda BinaryFormatter.Deserialize
ex: FileStream fs = new FileStream(data.out, FileMode.Open); BinaryFormatter bf = new BinaryFormatter(); string data = (string)bf.Deserialize(fs); fs.Close();
11/26/07
11/26/07
ex:
[Serializable] class ObiectCumparat { public int productID; public decimal pret; public int cantitate; public decimal total;
public ObiectCumparat(int productID, decimal pret, int cantitate) { this.productID = productID; this.pret = pret; this.cantitate = cantitate; total = pret*cantitate; } }
11/26/07 L3 .NET ADF - (C) Victor Adrian Prisacariu
Observam ca variabila total este calculata prin inmultirea valorilor pret si cantitate, deci stocarea sa pe disc este inutila si va ocupa spatiu suplimentar. Putem in schimba sa actualizam aceasta variabila dupa deserializare. Pentru a realiza acest lucru platforma .NET contine:
atributul [NonSerialized] pe care il punem inaintea definiri variabilei si care va instrui serializatorul sa nu o serializeze interfata IDeserializationCallback ce contine metoda IDeserializationCallback.OnDeserialization ce va fi apelata cand se termina deserializarea.
11/26/07 L3 .NET ADF - (C) Victor Adrian Prisacariu
11/26/07
Versionare
O problema ce poate sa apara la serializare este compatibilitatea cu versiunile anterioare. Daca versiunea 1.0 a aplicatiei noaste foloseste un format de clasa si versiunea 1.1 mai adauga un camp ce va fi serializat/deserializat pot sa apara probleme. Pentru a rezolva problema putem folosi atributul [OptionalField] pt. membrii noi adaugati. Acesta nu afecteaza procesul de serializare. La deserializare daca nu va fi gasit in streamul de intrare runtime-ul nu va da eroare dar va seta valoarea variabilei optionale ca null sau valoarea default pentru tipul respectiv.
11/26/07 L3 .NET ADF - (C) Victor Adrian Prisacariu
10
11/26/07
11
Versionare
12
11/26/07
13
11/26/07
14
SOAPFormatter
ex: FileStream fs = new FileStream(data.in, FileMode.Open); SOAPFormatter bf = new SOAPFormatter(); string data = (string)bf.Deserialize(fs); fs.Close(); Pentru a obtine compatibiliate maxima intre aplicatia voastra si alte aplicatii ce vor deserializa datele puteti folosi atribute prin care sa controlati formatul datelor scrise in stream-ul de iesire. Pentru mai multe detali cititi la pagina 280 in cartea .NET .
11/26/07 L3 .NET ADF - (C) Victor Adrian Prisacariu
15
Serializare XML
XML este un format standardizat, bazat pe text, pentru stocarea unor informatii ce pot fi citite usor de aplicatii. XML foloseste un format de organizare a datelor de tip arborescent. XML poate fi folosit pentru stocarea oricarui tip de date inclusiv documente, imagini, filme, muzica, etc. .NET framework ofera mai multe biblioteci pentru citire si scriere fisiere XML
11/26/07
16
Este recomandat sa folositi serializarea XML atunci cand doriti interoperatibilitate, mai exact atunci cand doriti ca fisierele produse sau modificate de aplicatia voastra sa fie usor citibile de aplicatii ce nu sunt scrise in .NET In consecinta serializare XML are urmatoarele avantaje:
Interoperatibilitate mai mare Fisierele pot fi editate usor cu editoare normale text Versionare mai usoara
17
11/26/07
PAS1: Crearea unui stream care va tine obiectul serializat (sau a unui TextWriter sau a unui XmlWriter) PAS2: Crearea unui obiect XmlSerializer ce va primi ca parametru la constructor un tipul obiectului pe care il vom serializa PAS3: Apelarea metodei XmlSerializer.Serialize
ex: FileStream fs = new FileStream(data.out,FileMode.Create); XmlSerializer xmls = new XmlSerializer(typeof(DateTime)); xmls.Serialize(fs,DateTime.Now); fs.Close();
11/26/07 L3 .NET ADF - (C) Victor Adrian Prisacariu
18
PAS1: Creare stream de unde vom citi datele serializate PAS2: Creare obiect XmlSerializer (cu parametru la constructor tipul obiectului de deserializat) PAS3: Apelarea metodei XmlSerializer.Deserialize
ex: FileStream fs = new FileStream(data.out,FileMode.Create); XmlSerializer xmlDs = new XmlSerializer(typeof(DateTime)); DateTime dataTrecuta = (DateTime)xmlDs.Deserialize(fs); fs.Close();
11/26/07 L3 .NET ADF - (C) Victor Adrian Prisacariu
19
11/26/07
20
Daca dorim interoperatibilitate cu alte limbaje de programare uneori este necesara schimbarea formatului in care se va scrie sau citi fisierul XML. Aceasta schimbare se face prin diferite atribute aplicate membrilor clasei ce va fi serializata/deserializata
11/26/07
21
Fisierul XML rezultat dupa serializare va avea urmatorul continut: <?xml version 1.0> <ObiectCumparat> <productID>100</productID> <pret>1000</pret> <cantitate>10</cantitate> <total>1212</total> </ObiectCumparat>
11/26/07
22
Exemple de atribute (pentru o lista completa vedeti pagina 293 din cartea .NET ADF):
XmlAttribute: Membrul va fi serializat ca atribut XML XmlElement: Membrul va fi serializat ca un element XML XmlIgnore: Membrul va fi ignorat XmlRoot: Este folosit pentru a specifica optiuni despre namespace si numele elementului
Daca atributele nu sunt suficiente pentru a obtine formatul dorit, puteti creea propriul serializator XML implementand IXmlSerializable cu metodele ReadXml si WriteXml.
11/26/07 L3 .NET ADF - (C) Victor Adrian Prisacariu
23
ex: [XmlRoot(ObiectDeCumparat)
public class ObiectCumparat { [XmlAttribute] public int productID; public decimal pret; public int cantitate; [XmlIgnore] public decimal total; public ObiectCumparat() { } } <?xml version 1.0> <ObiectDeCumparat productID=100> <pret>1000</pret> <cantitate>10</cantitate> </ObiectDeCumparat>
11/26/07
24
XML Schema
Atunci cand 2 aplicatii schimba intre ele fisiere XML, acestea respecta in general o anumita maniera de organizare numita schema. Pentru mai multe info despre Xml schema: http://www.w3.org/XML/Schema .NET framework contine o aplicatie ce genereaza automat clase dupa o anumita schema (xsd.exe).Cand veti instantia o astfel de clasa fisierul XML generat din ea va respecta schema respectiva. E o metoda mai simpla si typesafe de a parsa si a scrie un document XML care sa respecte un anumit format.
11/26/07
25
XML Schema
11/26/07
26
Serializare custom
Serializare custom este procesul prin care controlati complet mecanismul de serializare si deserializare a unui obiect. Puteti realiza o interoperatibilitate mai mare si o versionare mai buna folosind serializarea custom.
11/26/07
27
Puteti modifica mecanismul .NET de serializare/deserializare mostenind interfata ISerializable si aplicand atributul Serializable la clasa. Mostenirea clasei ISerializable inseamna implementarea metodelor GetObjectData si a unui constructor special care va fi folosit la deserializare. Runtime-ul va apela metoda GetObjectData la serializare si acel constructor la deserializare. Compilatorul va va avertiza daca nu ati implementat GetObjectData, dar daca nu ati implementat constructorul doar la runtime se va arunca o exceptie la deserializare.
11/26/07
28
29
[Serializable] class ObiectCumparat : ISerializable { public int productID; public decimal pret; public int cantitate; [NonSerialized] public decimal total; protected ObiectCumparat(SerializationInfo info, StreamingContext context) { this.productID = info.GetInt32(Product ID); this.pret = info.GetDecimal(Pret); this.cantitate = info.GetInt32(Cantitate); this.total = pret*cantitate; }
} [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter=true)] public virtual void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue(Product ID,productID); info.AddValue(Pret,pret); info.AddValue(Cantitate,cantitate); }
11/26/07
30
Evenimente in serializare
Atunci cand folositi BinaryFormatter .NET framework poate declansa anumite evenimente in diferite momente ale procesului de serializare.
Serializare incepe
[OnSerializing]
[OnSerialized]
11/26/07
31
Evenimente in deserializare
Deserializarea incepe [OnDeserializing] Deserializarea are loc
[OnDeserialized]
11/26/07
32
Evenimente
Pentru a putea raspunde la aceste evenimente trebuie sa construiti metode ce primesc ca parametru un StreamingContext, au ca atribut tipul de eveniment la care raspund si nu returneaza nimic:
ex: [OnDeserializing] void CalculareTotal(StreamingContext sc) { total = pret*cantitate; }
11/26/07 L3 .NET ADF - (C) Victor Adrian Prisacariu
33
StreamingContext
Obiectul StreamingContext este folositor atunci cand doriti o serializare/deserializare diferita in functie de destinatia obiectului. ex: in general nu e nevoie sa serializati informatii despre procesul in curs pentru ca ele vor fi invechite la deserializare. Totusi daca deserializatorul este chiar procesul in curs aceasta pot fi foarte folositoare Aceasta informatie este stocata in StreamingContext
11/26/07 L3 .NET ADF - (C) Victor Adrian Prisacariu
34
StreamingContext
35