Reguli de serializare

Comunicare de la distanță .NET

Atunci când dezvoltăm noi tipuri, este necesar să selectăm tehnologiile pe care aceste tipuri ar trebui să le sprijine (dacă este cazul). Mai jos sunt recomandările care vă vor ajuta să faceți această alegere și veți descrie modul de implementare a acestui sprijin. Aceste recomandări nu ar trebui luate ca o indicație pentru selectarea unei tehnologii de serializare pentru a fi utilizate în implementarea unei aplicații sau a unei biblioteci. Ele nu sunt direct legate de dezvoltarea API, astfel încât descrierea lor completă nu poate fi dată în această secțiune.

Dezvoltarea de noi tipuri TREBUIE realizată ținând seama de serializare.

Trebuie să fie luată în considerare la dezvoltarea tuturor tipurilor, deoarece este posibil ca programul să aibă nevoie să stocheze sau să trimită un exemplu de tip.

Alegerea serializării potrivite pentru a fi acceptată

Orice tip poate să susțină una sau mai multe tehnologii de serializare și să nu accepte nici unul.

Dacă trebuie să salvați sau să utilizați instanțe de tip în serviciile Web, RECOMANDĂți că alegeți să susțineți serializarea contractului de date.

Dacă aveți nevoie de un control suplimentar asupra formatului XML creat la serializarea unui tip, RECOMANDĂ să alegeți suportul pentru serializarea XML în loc de a serializa contractul de date sau în plus față de acesta.

Sprijinul pentru această tehnologie poate fi necesar în anumite scenarii de interacțiune în care este necesar să se utilizeze construcții XML care nu sunt suportate atunci când contractul de date este serializat, de exemplu atunci când se creează un atribut XML.

Dacă instanțele unui tip trebuie să fie transferate în afara limitelor arhitecturii interacțiunii .NET de la distanță, RECOMANDĂ să alegeți suport pentru serializarea runtime.

Nu se recomandă să alegeți serializarea runtime sau serializarea XML pentru a profita de beneficiile comune oferite de reținere. În schimb, recomandăm utilizarea serializării contractului de date

Sprijin pentru serializarea contractelor de date

Tipurile pot sustine serializarea contractului de date atunci când se aplică DataContractAttribute la tipul și aplicația DataMemberAttribute la elementele (câmpurile și proprietățile) ale tipului.

Este RECOMANDAT să marcați elementele de date de tip ca fiind deschise dacă tipul poate fi utilizat într-un mediu parțial de încredere. Într-un mediu de încredere, serializatorii de date de date pot serializa și deserializa tipuri și elemente private, dar într-un mediu parțial de încredere, aceste operațiuni pot fi efectuate numai pe elemente deschise.

Este necesar să se implementeze o metodă de citire și o metodă setată pentru toate proprietățile care au atributul Data-MemberAttribute. Atunci când se utilizează serializatori de date de date, tipul este considerat serializabil numai dacă există atât metode de citire cât și de scriere. Dacă tipul nu este utilizat într-un mediu parțial de încredere, atunci una sau mai multe metode de accesare a proprietății pot fi închise.

Este RECOMANDAT să inițializați instanțele deserializate pentru a utiliza apelurile de recurs în serializare.

Când deserializați obiectele, constructorii nu sunt chemați. Prin urmare, orice logică care este executată într-o construcție normală ar trebui implementată ca unul dintre apelurile de serializare.

Atributul OnDeserializedAttribute este cel mai frecvent utilizat atribut callback. În plus, familia include atributele OnDeserializingAttribute. OnSeralizingAttribute și OnSerializedAttribute. Acestea pot fi folosite pentru marcarea apelurilor de apel efectuate înainte de deserializare, înainte de serializare și, respectiv, după serializare.

Se recomandă să se utilizeze KnownTypeAttribute pentru a specifica tipurile specifice care ar trebui folosite atunci când se deserializează un grafic de obiecte mai complex.

De exemplu, dacă tipul de element de date deserializat este reprezentat de o clasă abstractă, serializatorul va avea nevoie de informații despre tipul cunoscut. Pentru a selecta un tip specific pentru crearea de instanțe și atribuirea unui element. Dacă tipul cunoscut nu este specificat, atunci el trebuie să fie transferat în mod explicit la serializer (acest lucru se poate face prin trecerea tipurilor cunoscute către constructorul serializatorului) sau specificat în fișierul de configurare.

În cazurile în care lista tipurilor cunoscute este necunoscută static (atunci când se compilează clasa Persoană), KnownTypeAttribute poate indica și o metodă care returnează o listă de tipuri cunoscute în timpul rulării.

La crearea și modificarea tipurilor serializabile, RECOMANDĂ să furnizeze compatibilitate înainte și înapoi.

Trebuie reamintit faptul că fluxurile serializabile ale viitoarelor versiuni de tip pot fi deserializate la versiunea actuală a tipului și invers. Vă rugăm să fiți conștienți de faptul că elementele de date, chiar și închise, și interne, nu se pot schimba numele, tipurile, și chiar propriile sale tipuri de ordine în versiunile viitoare, dacă nu se iau măsuri speciale pentru a păstra contractul de parametri explicite în atributele sale. Când modificați tipurile serializabile, verificați compatibilitatea cu serializarea. Încercați să deserializați noua versiune în versiunea precedentă și invers.

Este RECOMANDAT implementarea interfeței IExtensibleDataObject. Acest lucru va face posibilă furnizarea unui ciclu de procesare a valorilor între diferite versiuni ale tipului.

Interfața furnizează serializatorului o garanție a lipsei de pierderi de date atunci când efectuează cicluri de valori. Proprietatea ExtensionData salvează toate datele dintr-o versiune viitoare a tipului care nu este cunoscut în versiunea curentă. Dacă versiunea curentă este apoi serializată și deserializată la o versiune ulterioară, în fluxul serializat vor fi disponibile date suplimentare datorită valorii proprietății ExtensionData.

Suport pentru serializarea XML

Serializarea contractelor de date este tehnologia de serializare primară (implicită) din .NET Framework, dar există scenarii de serializare pe care această tehnologie nu le suportă. De exemplu, nu oferă control complet asupra formei codului XML generat sau utilizat de serializator. Dacă aveți nevoie de un astfel de nivel ridicat de control, utilizați serializarea XML. prin dezvoltarea tipurilor care să sprijine această tehnologie de serializare.

Este necesară evitarea dezvoltării de tip specific pentru serializarea XML, cu excepția cazului în care trebuie să controlați formularul codului XML generat. Această tehnologie de serializare a fost înlocuită de serializarea contractului de date descris în secțiunea anterioară.

Cu alte cuvinte, nu ar trebui să aplicați atribute din spațiul de nume System.Runtime.Serialization la noi tipuri, cu excepția cazului în care acest tip este destinat să fie utilizat cu serializarea XML. Următorul exemplu descrie modul de utilizare a System.Xml.Serialization pentru a controla forma codului XML generat.

Este RECOMANDAT utilizarea implementării interfeței IXmlSerializable. dacă aveți nevoie de un nivel mai ridicat de control asupra formei codului XML serializabil decât cel furnizat atunci când aplicați atributele de serializare XML. Două metode de interfață, ReadXml și WriteXml. să asigure controlul complet asupra fluxului XML serializabil. Aceasta oferă posibilitatea de a controla schema XML creată pentru tip prin aplicarea atributului XmlSchemaProviderAttribute.

Sprijin pentru serializarea run-time

Serializarea în timp real este o tehnologie utilizată pentru interacțiunea cu .NET. Dacă intenționați să transferați tipurile utilizând remoting-ul .NET, trebuie să vă asigurați că suportă serializarea la timpul de execuție.

Asistența de bază pentru serializarea run-time poate fi furnizată utilizând atributul SerializableAttribute. În scenariile mai complexe, este implementat un model simplu de execuție a serializării (implementarea și furnizarea ISerializabilă a designerului serializării).

Se recomandă să se ofere suport pentru serializarea timpului de execuție pentru tipuri dacă tipurile vor fi utilizate în interacțiune .NET. De exemplu, spațiul de nume System.AddIn utilizează interacțiunea .NET de la distanță și, prin urmare, toate tipurile au trecut între add-in-urile System.AddIn. trebuie să susțină serializarea la timpul de execuție.

Articole similare