Dela via


Serialization

Kommentar

Det här innehållet skrivs om med behörighet från Pearson Education, Inc. från Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Den utgåvan publicerades 2008, och boken har sedan dess reviderats helt i den tredje utgåvan. En del av informationen på den här sidan kan vara inaktuell.

Serialisering är processen att konvertera ett objekt till ett format som enkelt kan bevaras eller transporteras. Du kan till exempel serialisera ett objekt, transportera det via Internet med HTTP och deserialisera det på måldatorn.

.NET Framework erbjuder tre huvudsakliga serialiseringstekniker som är optimerade för olika serialiseringsscenarier. I följande tabell visas dessa tekniker och de huvudsakliga ramverkstyperna som är relaterade till dessa tekniker.

Tekniknamn Huvudtyper Scenarier
Serialisering av datakontrakt DataContractAttribute
DataMemberAttribute
DataContractSerializer
NetDataContractSerializer
DataContractJsonSerializer
ISerializable
Allmän beständighet
Webbtjänster
JSON
XML-serialisering XmlSerializer XML-format med fullständig kontroll över XML-formen
Runtime-serialisering (binär och SOAP) SerializableAttribute
ISerializable
BinaryFormatter
SoapFormatter
.NET-fjärrkommunikation

✔️ Tänk på serialisering när du utformar nya typer.

Välja rätt serialiseringsteknik att stödja

✔️ ÖVERVÄG att stödja datakontraktsserialisering om instanser av din typ kan behöva bevaras eller användas i Webbtjänster.

✔️ ÖVERVÄG att stödja XML-serialiseringen i stället för eller utöver datakontraktsserialisering om du behöver mer kontroll över XML-formatet som skapas när typen serialiseras.

Detta kan vara nödvändigt i vissa samverkansscenarier där du behöver använda en XML-konstruktion som inte stöds av Data Contract Serialization, till exempel för att skapa XML-attribut.

✔️ ÖVERVÄG att stödja Runtime Serialization om instanser av din typ behöver färdas över .NET-fjärrkommunikationsgränser.

❌ UNDVIK att stödja runtime-serialisering eller XML-serialisering bara av allmänna beständighetsskäl. Föredrar serialisering av datakontrakt i stället.

Serialisering av stöd för datakontrakt

Typer kan stödja datakontraktsserierering genom att tillämpa DataContractAttribute på typen och DataMemberAttribute på medlemmarna (fält och egenskaper) av typen.

✔️ ÖVERVÄG att markera datamedlemmar av din typ offentligt om typen kan användas i partiellt förtroende.

I fullständigt förtroende kan datakontraktsserialiserare serialisera och deserialisera icke-offentliga typer och medlemmar, men endast offentliga medlemmar kan serialiseras och deserialiseras i partiellt förtroende.

✔️ IMPLEMENTERA en getter och setter för alla egenskaper som har DataMemberAttribute. Serialiserare för datakontrakt kräver att både getter och setter för att typen ska betraktas som serialiserbar. (I .NET Framework 3.5 SP1 kan vissa samlingsegenskaper endast vara get-only.) Om typen inte används i partiellt förtroende kan en eller båda egenskapsåtkomsterna vara icke-offentliga.

✔️ ÖVERVÄG att använda serialiseringsåteranrop för initiering av deserialiserade instanser.

Konstruktorer anropas inte när objekt deserialiseras. (Det finns undantag till regeln. Konstruktorer för samlingar som markerats med CollectionDataContractAttribute anropas under deserialisering.) Därför måste all logik som körs under normal konstruktion implementeras som en av serialiseringsåteranropen.

OnDeserializedAttribute är det vanligaste motringningsattributet. De andra attributen i familjen är OnDeserializingAttribute, OnSerializingAttributeoch OnSerializedAttribute. De kan användas för att markera återanrop som körs före deserialisering, före serialisering respektive efter serialisering.

✔️ ÖVERVÄG att använda KnownTypeAttribute för att ange konkreta typer som ska användas vid deserialisering av ett komplext objektdiagram.

✔️ Överväg bakåt- och framåtkompatibilitet när du skapar eller ändrar serialiserbara typer.

Tänk på att serialiserade strömmar av framtida versioner av din typ kan deserialiseras till den aktuella versionen av typen och vice versa.

Se till att du förstår att datamedlemmar, även privata och interna, inte kan ändra sina namn, typer eller ens deras ordning i framtida versioner av typen om inte särskild försiktighet vidtas för att bevara kontraktet med explicita parametrar till datakontraktsattributen.

Testa serialiseringens kompatibilitet när du gör ändringar i serialiserbara typer. Prova att deserialisera den nya versionen till en gammal version och vice versa.

✔️ ÖVERVÄG att implementera IExtensibleDataObject för att tillåta avrundning mellan olika versioner av typen.

Gränssnittet gör det möjligt för serialiseraren att se till att inga data går förlorade vid avrundning. Egenskapen IExtensibleDataObject.ExtensionData används för att lagra data från den framtida versionen av den typ som är okänd för den aktuella versionen, och därför kan den inte lagras i sina datamedlemmar. När den aktuella versionen senare serialiseras och deserialiseras till en framtida version blir ytterligare data tillgängliga i den serialiserade dataströmmen.

Stöd för XML-serialisering

Serialisering av datakontrakt är den huvudsakliga serialiseringstekniken (standard) i .NET Framework, men det finns serialiseringsscenarier som datakontraktsserialisering inte stöder. Det ger till exempel inte fullständig kontroll över formen på XML som skapas eller används av serialiseraren. Om sådan fin kontroll krävs måste XML-serialisering användas och du måste utforma dina typer för att stödja den här serialiseringstekniken.

❌ UNDVIK att utforma dina typer specifikt för XML-serialisering, såvida du inte har en mycket stark anledning att styra formen på den XML som skapas. Den här serialiseringstekniken har ersatts av datakontraktsserialiseringen som beskrivs i föregående avsnitt.

✔️ ÖVERVÄG att implementera IXmlSerializable gränssnittet om du vill ha ännu mer kontroll över formen på den serialiserade XML-koden än vad som erbjuds genom att använda XML-serialiseringsattributen. Med två metoder i gränssnittet, ReadXml och WriteXml, kan du helt styra den serialiserade XML-dataströmmen. Du kan också styra XML-schemat som genereras för typen genom att XmlSchemaProviderAttributetillämpa .

Stöd för runtime-serialisering

Runtime Serialization är en teknik som används av .NET Remoting. Om du tror att dina typer kommer att transporteras med .NET-fjärrkommunikation måste du se till att de stöder Runtime Serialization.

Det grundläggande stödet för Runtime Serialization kan tillhandahållas genom att tillämpa SerializableAttribute, och mer avancerade scenarier omfattar implementering av ett enkelt Runtime Serializable Pattern (implementera ISerializable och tillhandahålla serialiseringskonstruktor).

✔️ ÖVERVÄG att stödja Runtime-serialisering om dina typer ska användas med .NET-fjärrkommunikation. Namnområdet använder till exempel System.AddIn .NET-fjärrkommunikation, så alla typer som utbyts mellan System.AddIn tillägg måste ha stöd för Runtime-serialisering.

✔️ ÖVERVÄG att implementera Runtime Serializable Pattern om du vill ha fullständig kontroll över serialiseringsprocessen. Om du till exempel vill transformera data när de serialiseras eller deserialiseras.

Mönstret är mycket enkelt. Allt du behöver göra är att implementera ISerializable gränssnittet och tillhandahålla en särskild konstruktor som används när objektet deserialiseras.

✔️ Gör serialiseringskonstruktorn skyddad och ange två parametrar som skrivs och namnges exakt som i exemplet här.

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

✔️ ISerializable IMPLEMENTERA MEDLEMMARNA explicit.

✔️ Tillämpa ett länkbehov på ISerializable.GetObjectData implementeringen. Detta säkerställer att endast fullständigt betrodd kärna och Runtime Serializer har åtkomst till medlemmen.

Portioner © 2005, 2009 Microsoft Corporation. Med ensamrätt.

Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, publicerad 22 okt 2008 av Addison-Wesley Professional som en del av Microsoft Windows Development Series.

Se även