Serializarea (serializare) în c #

Serializare - procesul de conversie a unui obiect sau a unui grup de obiecte legate de fluxul de octet sau un set de noduri XML pentru a salva (baza de date, fișierul, etc.) sau transmiterea (de ex, printr-o rețea). Deserializarea - proces invers - recuperarea din fluxul de octeți obiect sau XML noduri. Serializare este de obicei folosit pentru a transfera obiecte peste o limită de rețea sau o aplicație, pentru a salva obiectele din fișierul sau baza de date, precum și o copie profundă a obiectelor.

Clase pentru serializarea aranjate în două namespace: System.Runtime.Serialization și System.Xml.Serialization.

mecanismul de serializare

4 mecanism disponibil pentru serializare în .NET:

  • serializer Contract de date
  • serializer binar
  • XML serializare (XmlSerializer)
  • interfaţă IXmlSerializable

Primele trei sunt mecanisme gata pentru serializarea și de a face toate lucrările le interfață IXmlSerializable implică punerea în aplicare a mecanismului de serializare independent.

Prezența a trei mecanisme diferite de serializare este un punct de vedere istoric.

Serializer acestor contracte este cel mai nou și versatil. Acesta poate fi utilizat în schimbul de informații prin intermediul unor protocoale de mesagerie. Acesta prevede, de asemenea, versiuni de tolerabilitate buna si permite date deserialized obținute de la un tip mai devreme sau mai târziu, datorită faptului că elimină legătura dintre detaliile de nivel redus ale structurii obiectelor și datele serializate. Serializer acestor contracte pot fi utilizate în majoritatea sarcinilor în loc de serializare binare și XML.

serializer binar ușor de utilizat, și bine întreținute automatizate pe tot parcursul .NET. Remoting utilizează infrastructura serializare binare, inclusiv interacțiunea dintre cele două domenii de aplicare, în același proces. serializer binar funcționează mai rapid decât serializare Contractului de date, dar oferă toleranță inferioară cât mai strâns leagă structura de tip interior cu formatul de date serializate. De asemenea, nu poate fi folosit pentru a genera XML.

XmlSerializer poate genera XML numai, și în comparație cu alte mecanisme, este mai puțin funcțional cu serializarea grupe complexe de obiecte. Cu toate acestea, coroborat cu XML oferă cea mai mare funcționalitate, și oferă o versiune bine tolerat.

Punerea în aplicare interfață IXmlSerializable își asumă responsabilitatea operațională pentru serializare cu XMLReader și XMLWriter.

Încheierea acestor contracte de serializare și serializare binare se face cu un dop formatorului. Rezultatele Formatter formează prezentarea finală, în conformitate cu mediul special sau serializarea context. Există două formatorului: formatorului XML și formatorul binar. formatorului XML utilizat kontekset de citire / înregistrare XML, fișierul text și flux, mesaje SOAP. formatorului binar utilizat în cadrul unui flux de octeți arbitrar. Binar dimensiunea de ieșire este de obicei mai mică decât XML, uneori în mod semnificativ. Teoretic mecanismul serialzitsii nu este legat de formatorului, dar, în practică, aceste contracte serializare utilizează formatorului XML și un serializare binar - formatorului binar.

serializer Contract de date

Utilizarea serializer aceste contracte implică următoarele trei etape

  • selectați clasa de a utiliza: DataContractSerializer sau NetDataContractSerializer
  • adăuga tipuri de serializabile și membri atributele [DataContract] și [DataMember] (respectiv)
  • a crea o instanță a serializare și a apela metodele sale sau WriteObject ReadObject

Există două serializare contract de date:

  • DataContractSerializer - oferă o legare slabă la .NET tipuri tipuri de date de contracte. Poate genera respectă standardele XML. Necesită pre-înregistrare explicite tipuri de derivate serializate pentru a putea compara numele de contract de date cu numele tipurilor .NET
  • NetDataContractSerializer - caracterizată prin legarea strânsă la tipurile de date .NET tipuri de contracte, nu necesită o înregistrare explicită serializat tipuri derivate, deoarece scrie în mod independent, numele complete și tipurile de tipuri de ansambluri serializate

După selectarea unui serializare este necesară pentru toate tipurile de serializabile pentru a adăuga un atribut [DataContract]. și membrii acestora, să includă în serializarea - atributele [DataMember]:

cârlige de serializare

Imediat înainte și după serializarea sau deseralizatsii poate efectua o metodă specială. Întrebați această metodă utilizând următoarele atribute:

  • [OnSerializing] - precizează metoda de a invoca în fața serializarea
  • [OnSerialized] - precizează metoda de a invoca atunci când serializarea
  • [OnDeserializing] - specifică metoda pentru a apela înainte ca deserializarea
  • [OnDeserialized] - precizează metoda de a invoca după deserializarea

O astfel de metodă ar trebui să ia un singur parametru de tip StreamingContext. dar este necesar doar pentru coerența cu mecanismul de serializare binar nu este utilizat, contractele de date serializer.

Deoarece serializers nu realiza constructori și initializatori când deserializing, aceste metode pot fi utilizate ca constructori sau initializatori câmpului electromagnetic în timpul deserializarea pentru a atribui valori membrilor excluși din serializarea, pentru că fără ea exclus din membrii serializare vor primi atunci când deserializing valorile implicite pentru tipurile lor, dar nu cele valori care sunt atribuite lor în constructorilor și initializatori.

Metodele pot fi atât publice, cât și private. Tipuri de derivate pot defini cârligele lor și le-au provocat, de asemenea, budt.

Suport pentru mecanismul de serializare binar

Serializers aceste contracte pot, de asemenea, serializează tipuri marcate atribut [Serializable] și pune în aplicare interfață ISerializable. În acest caz, nu există nici o schimbare a serializarea binare, dar ka multe mecanisme lucru cu serializarea binare: ia în considerare atributele [NonSerialized]. efectuat GetObjectData metode și constructori deserializarea.

Nu este permis să folosească ambele contracte atribute și atributelor serializarea binare.

serializer binar

Asigurați-tip de suport serializare binar în două moduri:

  • adăugați tipul de atribut [Serializable]
  • punerea în aplicare a interfeței ISerializable în clasa

Adăugarea unui atribut este mai ușor, dar punerea în aplicare de interfață oferă mai multe oportunități.

Atribut [Serializable]

Asigurați-vă de tip serializabilă posibil cu un singur atribut:

Atributul [Serializable] serializare indică necesitatea de a include toate domeniile de acest tip, atât publice cât și private, dar nu includ proprietăți.

Fiecare câmp trebuie să fie de tip serializabilă și anume tip atribut marcat [Serializable]. sau implementeaza interfata ISerializable. Tipuri de primitive și multe alte tipuri de NET sunt serializabil.

atribut serializabilă nu este moștenit, astfel încât clasa derivată nu sunt în mod automat în cazul în care nu serializabilă atribuie în mod specific tag-ul Serializable.

Proprietăți tip nu sunt serializate, dar serializate care stau la baza câmpurilor generate automat (din păcate, aceste câmpuri pot fi redenumite recompilarea).

Efectuarea serializarea binare

Pentru a efectua formatorului serializare binare, trebuie să creați un obiect și de apel Serialize metodei sale. Pentru serializarea binare formatorului prevede două:

  • BinaryFormatter - mai eficient, generează o concluzie mică în mai puțin timp. Definit în numele spațiilor System.Runtime.Serialization.Formatters.Binary
  • SoapFormatter - suport pentru mesajele de bază, mai puțin funcțional, nu suportă serializarea tipurilor generice și a filtra datele străine. Definit în numele spațiilor System.Runtime.Serialization.Formatters.Soap

Ambele folosesc aceeași formatorului:

Când recrearea obiecte deserializare ignoră toate designeri.

date serializate include informații complete despre tipul și ansamblul, așa că, dacă desereializatsii încercați tip duce la un tip compatibil, apare o eroare. Deserializare restabilește referințele obiect la starea lor inițială.

serializers binare sprijinit, de asemenea, atributele [OnSerializing]. [OnSerialized]. [OnDeserializing] și [OnDeserialized]. Utilizarea lor nu diferă de contractele serializers de date.

Caracteristica [NonSerialized]

În schimb, serializers date contracte care trebuie să fie etichetate atribute ale tuturor câmpului serializabilă un serializare binar care nu are nevoie, și în mod implicit include toate câmpurile serializate obiect. Excludeți câmpuri individuale de serializare poate observând atributul lor [NonSerialized]:

Acest lucru indică faptul că serializare nu arunca o excepție în cazul în care nu se întâlnește în câmpurile marcate cu fluxul de date serializat și pur și simplu să presupunem că domeniul nu este serializat și lăsați-l gol (poate fi atribuită o valoare prin metoda de [OnDeserializing]).

Argumentul VersionAdded - este un număr întreg, incrementat de fiecare dată când adăugați un nou tip de golf. Este mai degrabă doar de referință și nu afectează serializarea.

În general, în scopul de a menține versiuni sunt sfătuiți să evite redenumirea, ștergerea și schimbarea tipului de domenii.

Când BinaryFormatter când deserializing detectează câmpul serializate flux de date care nu este declarat în clasă, el pur și simplu aruncați și SoapFormatter sgenenriuet excepție.

interfaţă ISerializable

Implementarea ISerializable tip de interfață oferă un control deplin asupra modului în care este produs binar serializate și deserialized. Definiția interfață este după cum urmează:

În exemplul de valori SerializationInfo obiect al tastelor coincid cu numele câmpurilor din clasa, dar acest lucru nu este necesar: este permisă utilizarea de orice chei de coarde, cu condiția ca constructorul deserializarea va fi capabil de a le converti în numele câmpurilor. Valorile reale se pot aplica la orice tip de serializabilă: serializarea recursiv se va efectua, dacă este necesar. De asemenea, este permisă în cazul în care valoarea în dicționar este nul.

Se recomandă declararea unei metode ca GetObjectData virtuale. astfel încât clasele derivate se poate extinde serializarea din nou, fără punerea în aplicare a interfeței baza ISerializable.

Clasa SerializationInfo cuprinde, de asemenea, proprietăți permit controlul asupra tipului și ansamblului, în care instanța deserialized să fie plasate.

parametru StreamingContext - l struktrura pe de alții care conțin o valoare enum, indicând în cazul în care sosește instanța serializate.

În plus față de punerea în aplicare a interfeței ISerializable. tipul de proprii deserializarea serializarea managerului trebuie să conțină un constructor care are doi parametri sunt aceleași ca metoda GetObjectData. Acesta poate fi declarat cu orice modificator de acces.

Pentru un număr de clasă tipuri SerializationInfo are metode speciale Get *. de exemplu, getString. pentru prepararea mai convenabilă a valorilor cheie. Dacă SerializationInfo obiect nu contează cu cheia solicitată, acesta va fi aruncat.

serializer XML

Spațiul de nume System.Xml.Serialization definit un alt serializer - XmlSerializer. Acesta vă permite să serializa tipuri de la fișiere XML. La fel ca cele două abordări sunt disponibile la serializare binar:

  • adăuga atribute la tipul de spațiu nume System.Xml.Serialization
  • IXmlSerializable pune în aplicare interfață

Diferența din interfața binară de implementare serializare IXmlSerializable elimină utilizarea built-serializare, lăsând dezvoltator scris auto cod serializarea folosind XMLReader și XMLWriter.

Efectuarea serializarea XML