Net, configurarea obiectelor de serializare

Pentru a face un obiect disponibil pentru serviciile de serializare .NET, trebuie doar să decorați fiecare clasă (sau structură) asociată cu atributul [Serializabil]. Dacă se dovedește că un anumit tip are membri de date care nu ar trebui (sau nu pot) să participe la schema serializării, puteți marca astfel de câmpuri cu atributul [NonSerialized]. Acest lucru ajută la reducerea mărimii datelor stocate, cu condiția să existe variabile membre în clasa serializabilă care nu ar trebui "memorate" (de exemplu, valori fixe, valori aleatorii, date pe termen scurt etc.).







Mai întâi, creați o nouă aplicație de consolă. Adăugăm o nouă clasă numită Radio, marcată cu atributul [Serializabil], care exclude o variabilă membru (radioID), marcată cu atributul [NonSerialized] și, prin urmare, nu este stocată în fluxul de date specificat:

Apoi adăugați două tipuri suplimentare care reprezintă clasele de bază JamesBondCar și Car (ambele sunt marcate și cu atributul [Serializable]) și definiți următoarele câmpuri de date:

Rețineți că atributul [Serializabil] nu poate fi moștenit din clasa parentală. Prin urmare, dacă moșteniți tipul marcat cu [Serializabil], clasa copil trebuie să fie de asemenea marcată [Serializabil] sau nu poate fi salvată în flux. De fapt, toate obiectele din graficul obiect trebuie să fie marcate cu atributul [Serializabil]. O încercare de serializare a unui obiect care nu poate fi serializat utilizând BinaryFormatter sau SoapFormatter are ca rezultat eliminarea SerializationException la timpul de execuție.







Rețineți că în fiecare dintre aceste clase câmpurile de date sunt definite ca fiind publice, acest lucru se face pentru a simplifica exemplul. Desigur, datele private prezentate de proprietățile disponibile publicului ar fi mai preferabile din punctul de vedere al POR. De asemenea, pentru simplitate, în aceste tipuri nu sunt definiți constructori specifici și, prin urmare, toate câmpurile de date neinitializate vor obține valorile implicite așteptate.

Lăsând deoparte principiile POR, puteți întreba: ce definiție a câmpurilor de date de tipul necesită formator diferit pentru a le serializa în flux? Răspunsul este: în funcție de circumstanțe. Dacă salvați starea unui obiect utilizând BinaryFormatter sau SoapFormatter. atunci nu există nici o diferență. Aceste tipuri sunt programate pentru a serializa toate câmpurile de tip serializabil, indiferent dacă sunt reprezentate de câmpuri publice, câmpuri private sau câmpuri private cu proprietățile publice corespunzătoare.

Cu toate acestea, rețineți că, dacă există elemente de date care nu ar trebui să fie stocate în graficul obiect, puteți marca selectiv câmpuri publice sau private cu atributul [NonSerialized], așa cum se face cu câmpurile de tip șir din tipul de radio.

Cu toate acestea, situația se schimbă semnificativ dacă intenționați să utilizați tipul XmlSerializer. Acest tip va serializa numai câmpurile de date publice serializabile sau câmpurile private reprezentate de proprietățile publice. Datele private, care nu sunt reprezentate de proprietăți, sunt pur și simplu ignorate. De exemplu, luați în considerare următorul personalizabil Tip serializabil:

Când se procesează BinaryFormatter sau SoapFormatter, se constată că câmpurileAlive, personAge și fName sunt stocate în fluxul selectat. Cu toate acestea, XmlSerializer nu stochează valoarea personAge, deoarece această parte a datelor private nu este încapsulată în proprietate. Pentru a salva vârsta persoanei cu XmlSerializer, acest câmp va trebui definit ca public sau încapsulat într-o proprietate publică.







Articole similare

Trimiteți-le prietenilor: