Orice clasă care poate fi serializată trebuie marcată cu atributul SerializableAttribute. Dacă clasa trebuie să gestioneze procesul de serializare, puteți implementa interfața ISerializable. Formatorul solicită GetObjectData în timpul serializării și completează SerializationInfo cu toate datele necesare reprezentării obiectului. Formatter Creează un SerializationInfo cu tipul de obiect din grafic. Obiectele care trebuie să trimită un proxy pentru ele însele pot utiliza metode FullTypeName și AssemblyName. SerializationInfo Schimbă datele care urmează să fie transmise.
În cazul moștenirii în clasă, este posibilă serializarea unei clase derivate dintr-o clasă de bază care implementează ISerializabil. În acest caz, clasa derivată trebuie să apeleze la implementarea clasei de bază GetObjectData în implementarea lui GetObjectData. În caz contrar, datele din clasa de bază nu vor fi serializate.
ISerializable Interfața include constructorul folosind semnătura constructorului (informația SerializationInfo a contextului StreamingContext). În timpul deserializării, constructorul actual este chemat numai după ce datele din SerializationInfo sunt deserializate folosind modulul de formatare. În mod tipic, acest constructor trebuie protejat dacă clasa nu este sigilată.
Ordinea în care obiectele sunt deserializate nu poate fi garantată. De exemplu, dacă un tip se referă la un tip care nu a fost deserializat, va apărea o excepție. Când creați tipuri care au astfel de dependențe, puteți remedia problema implementând interfața IDeserializationCallback și metoda OnDeserialization.
Arhitectura serializării gestionează tipurile de obiecte care extind MarshalByRefObject la fel ca și tipurile care extind Obiectul. Aceste tipuri pot fi etichetate cu SerializableAttribute și pot implementa interfața ISerializable ca orice alt tip de obiect. Stările obiectului lor vor fi captate și stocate în flux.
Dacă aceste tipuri sunt utilizate prin System.Runtime.Remoting. infrastructura de interacțiune de la distanță oferă un înlocuitor care descarcă serialele tipice și serialează proxy-ul MarshalByRefObject. Un surogat este un asistent care știe cum să serializeze și să deserializeze obiecte de un anumit tip. Un server proxy invizibil pentru utilizator va fi, în majoritatea cazurilor, de tip ObjRef.
În cadrul șablonului general constructiv, nu este obișnuit să marcați clasa cu un atribut serializabil și să extindeți MarshalByRefObject. Dezvoltatorii trebuie să ia în considerare cu atenție scenariile posibile pentru serializare și interacțiune la distanță atunci când combină aceste două caracteristici. Acesta este un exemplu în care acest lucru poate fi folosit cu MemoryStream. Deși clasa de bază MemoryStream (Stream) se extinde de la MarshalByRefObject. există posibilitatea de a scrie starea MemoryStream și de ao restabili. Astfel, ar putea fi necesar să se serializeze starea acestui flux într-o bază de date și să se restaureze într-un moment ulterior. Cu toate acestea, atunci când se utilizează interacțiunea de la distanță, un obiect de acest tip ar fi un proxy.
Pentru mai multe informații despre serializarea claselor care extind MarshalByRefObject. în secțiunea RemotingSurrogateSelector. Aflați mai multe despre implementarea programului ISerializabil. în secțiunea User Serialization.
Note de implementare:
Implementați această interfață pentru a permite obiectului să participe la serializare și deserializare.