Delen via


Serialisatie

Opmerking

Deze inhoud wordt opnieuw afgedrukt met toestemming van Pearson Education, Inc. uit Framework Design Guidelines: Conventies, idioom en patronen voor herbruikbare .NET-bibliotheken, 2e editie. Die editie werd in 2008 gepubliceerd en het boek is sindsdien volledig herzien in de derde editie. Sommige informatie op deze pagina is mogelijk verouderd.

Serialisatie is het proces van het converteren van een object naar een indeling die gemakkelijk kan worden bewaard of vervoerd. U kunt bijvoorbeeld een object serialiseren, het via internet transporteren via HTTP en het object deserialiseren op de doelcomputer.

Het .NET Framework biedt drie belangrijke serialisatietechnologieën die zijn geoptimaliseerd voor verschillende serialisatiescenario's. De volgende tabel bevat deze technologieën en de belangrijkste frameworktypen die betrekking hebben op deze technologieën.

Naam van technologie Hoofdtypen Scenario's
Serialisatie van gegevenscontract DataContractAttribute
DataMemberAttribute
DataContractSerializer
NetDataContractSerializer
DataContractJsonSerializer
ISerializable
Algemene persistentie
Webservices
JSON
XML-serialisatie XmlSerializer XML-indeling met volledige controle over de vorm van de XML
Runtime-serialisatie (binair en SOAP) SerializableAttribute
ISerializable
BinaryFormatter
SoapFormatter
Externe communicatie van .NET

✔️ Denk aan serialisatie wanneer u nieuwe typen ontwerpt.

De juiste serialisatietechnologie kiezen ter ondersteuning

✔️ OVERWEEG OM serialisatie van gegevenscontracten te ondersteunen als exemplaren van uw type mogelijk moeten worden bewaard of gebruikt in webservices.

✔️ OVERWEEG de XML-serialisatie te ondersteunen in plaats van of naast serialisatie van gegevenscontracten als u meer controle nodig hebt over de XML-indeling die wordt geproduceerd wanneer het type wordt geserialiseerd.

Dit kan nodig zijn in sommige interoperabiliteitsscenario's waarbij u een XML-constructie moet gebruiken die niet wordt ondersteund door serialisatie van gegevenscontracten, bijvoorbeeld om XML-kenmerken te produceren.

✔️ OVERWEEG runtime-serialisatie te ondersteunen als exemplaren van uw type moeten worden verzonden over de grenzen van .NET Remoting.

❌ VERMIJD ondersteuning voor runtime-serialisatie of XML-serialisatie, alleen om algemene persistentieredenen. Geef in plaats daarvan de voorkeur aan serialisatie van gegevenscontracten.

Serialisatie van gegevenscontract ondersteunen

Typen kunnen gegevenscontractserialisatie ondersteunen door DataContractAttribute op het type toe te passen en DataMemberAttribute op de leden (velden en eigenschappen) van het type.

✔️ OVERWEEG datavelden van uw type openbaar te markeren als het type kan worden gebruikt in gedeeltelijk vertrouwen.

In volledig vertrouwen kunnen gegevenscontract-serializers niet-openbare typen en leden serialiseren en deserialiseren, maar in beperkte vertrouwensmodus kunnen alleen openbare leden worden geserialiseerd en gedeserialiseerd.

✔️ VOER uit: implementeer een getter en setter voor alle eigenschappen die DataMemberAttribute hebben. Voor serialisatie van gegevenscontracten moeten zowel de getter als de setter voor het type worden beschouwd als serialiseerbaar. (In .NET Framework 3.5 SP1 kunnen sommige verzamelingseigenschappen alleen worden get-only.) Als het type niet wordt gebruikt in gedeeltelijke vertrouwensrelatie, kunnen een of beide eigenschapstoegangsors niet openbaar zijn.

✔️ OVERWEEG de callbacks voor serialisatie te gebruiken voor initialisatie van gedeserialiseerde exemplaren.

Constructors worden niet aangeroepen wanneer objecten gedeserialiseerd worden. (Er zijn uitzonderingen op de regel. Constructors van verzamelingen die gemarkeerd zijn met CollectionDataContractAttribute worden aangeroepen tijdens deserialisatie.) Daarom moet logica die tijdens normale constructie wordt uitgevoerd, worden geïmplementeerd als een van de callbacks voor serialisatie.

OnDeserializedAttribute is het meest gebruikte callback-kenmerk. De andere kenmerken in het gezin zijn OnDeserializingAttribute, OnSerializingAttributeen OnSerializedAttribute. Ze kunnen worden gebruikt om callbacks te markeren die vóór deserialisatie worden uitgevoerd, vóór serialisatie en ten slotte na serialisatie.

✔️ OVERWEEG het gebruik van KnownTypeAttribute om concrete typen aan te geven die moeten worden gebruikt bij het deserialiseren van een complexe objectgrafiek.

✔️ Overweeg achterwaartse en voorwaartse compatibiliteit bij het maken of wijzigen van serialiseerbare typen.

Houd er rekening mee dat geserialiseerde streams van toekomstige versies van uw type kunnen worden gedeserialiseerd in de huidige versie van het type en omgekeerd.

Zorg ervoor dat u begrijpt dat gegevensleden, zelfs privé en intern, hun namen, typen of zelfs hun volgorde niet kunnen wijzigen in toekomstige versies van het type, tenzij speciale zorg wordt besteed aan het behouden van het contract met expliciete parameters voor de kenmerken van het gegevenscontract.

Test de compatibiliteit van serialisatie bij het aanbrengen van wijzigingen in serialiseerbare typen. Probeer de nieuwe versie te deserialiseren in een oude versie en omgekeerd.

✔️ OVERWEEG om IExtensibleDataObject te implementeren om roundtripping mogelijk te maken tussen verschillende versies van het type.

De interface stelt de serializer in staat ervoor te zorgen dat er geen gegevens verloren gaan tijdens het heen-en-weer sturen van gegevens. De IExtensibleDataObject.ExtensionData eigenschap wordt gebruikt om gegevens op te slaan uit een toekomstige versie van het type die onbekend is bij de huidige versie en daarom niet in de gegevensleden kan worden opgeslagen. Wanneer de huidige versie vervolgens wordt geserialiseerd en gedeserialiseerd in een toekomstige versie, zijn de aanvullende gegevens beschikbaar in de geserialiseerde stroom.

Ondersteuning voor XML-serialisatie

Data Contract Serialization is de belangrijkste (standaard) serialisatietechnologie in het .NET Framework, maar er zijn serialisatiescenario's die niet worden ondersteund door Data Contract Serialization. Het geeft u bijvoorbeeld geen volledige controle over de vorm van XML die door de serialisatiefunctie wordt geproduceerd of gebruikt. Als dergelijke controle vereist is, moet XML-serialisatie worden gebruikt en moet u uw typen ontwerpen om deze serialisatietechnologie te ondersteunen.

❌ VERMIJD het ontwerpen van uw typen specifiek voor XML-serialisatie, tenzij u een zeer sterke reden hebt om de vorm van de geproduceerde XML te beheren. Deze serialisatietechnologie is vervangen door de serialisatie van het gegevenscontract die in de vorige sectie is besproken.

✔️ OVERWEEG de IXmlSerializable interface te implementeren als u nog meer controle wilt over de vorm van de geserialiseerde XML dan wordt aangeboden door de XML-serialisatiekenmerken toe te passen. Met twee methoden van de interface ReadXmlWriteXmlkunt u de geserialiseerde XML-stroom volledig beheren. U kunt ook het XML-schema beheren dat voor het type wordt gegenereerd door het XmlSchemaProviderAttributetoe te passen.

Ondersteuning voor runtime-serialisatie

Runtime Serialisatie is een technologie die wordt gebruikt door .NET Remoting. Als u denkt dat uw typen worden vervoerd met .NET Remoting, moet u ervoor zorgen dat ze runtime-serialisatie ondersteunen.

De basisondersteuning voor runtimeserialisatie kan worden geboden door het toepassen van de SerializableAttribute, en meer geavanceerde scenario's omvatten het implementeren van een eenvoudig runtime serializeerbaar patroon (implementeren ISerializable en voorzien van serialisatieconstructor).

Overweeg runtime-serialisatie te ondersteunen als uw typen worden gebruikt met .NET Remoting. De System.AddIn-naamruimte gebruikt bijvoorbeeld .NET Remoting, en daarom moeten alle typen die tussen System.AddIn invoegtoepassingen worden uitgewisseld runtime-serialisatie ondersteunen.

✔️ OVERWEEG om het serialiseerbare runtimepatroon te implementeren als u volledige controle wilt over het serialisatieproces. Als u bijvoorbeeld gegevens wilt transformeren wanneer ze worden geserialiseerd of gedeserialiseerd.

Het patroon is heel eenvoudig. U hoeft alleen de ISerializable interface te implementeren en een speciale constructor te bieden die wordt gebruikt wanneer het object wordt gedeserialiseerd.

✔️ Maak de serialisatieconstructor beveiligd en geef twee parameters op die precies zijn getypt en benoemd zoals in het voorbeeld hier wordt weergegeven.

[Serializable]
public class Person : ISerializable
{
    protected Person(SerializationInfo info, StreamingContext context)
    {
        // ...
    }
}

Implementeer de ISerializable elementen expliciet.

✔️ DO past een koppelingsvraag toe op ISerializable.GetObjectData de implementatie. Dit zorgt ervoor dat alleen de volledig vertrouwde core en de runtime serializer toegang hebben tot het lid.

© Gedeelten 2005, 2009 Microsoft Corporation. Alle rechten voorbehouden.

Herdrukt door toestemming van Pearson Education, Inc. van Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, gepubliceerd 22 oktober 2008 door Addison-Wesley Professional als onderdeel van de Microsoft Windows Development Series.

Zie ook