Serializace
Poznámka:
Tento obsah je znovu vytištěn oprávněním Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms a Patterns for Reusable .NET Libraries, 2. vydání. Tato edice byla publikována v roce 2008 a kniha byla od té doby plně upravena ve třetím vydání. Některé informace na této stránce můžou být zastaralé.
Serializace je proces převodu objektu do formátu, který lze snadno zachovat nebo přenést. Můžete například serializovat objekt, přenést ho přes internet pomocí protokolu HTTP a deserializovat ho v cílovém počítači.
Rozhraní .NET Framework nabízí tři hlavní technologie serializace optimalizované pro různé scénáře serializace. Následující tabulka uvádí tyto technologie a hlavní typy architektur souvisejících s těmito technologiemi.
Název technologie | Hlavní typy | Scénáře |
---|---|---|
Serializace kontraktů dat | DataContractAttribute DataMemberAttribute DataContractSerializer NetDataContractSerializer DataContractJsonSerializer ISerializable |
Obecné stálost Webové služby JSON |
Serializace XML | XmlSerializer | Formát XML s úplnou kontrolou nad tvarem XML |
Serializace za běhu (binární a SOAP) | SerializableAttribute ISerializable BinaryFormatter SoapFormatter |
Vzdálené komunikace pomocí rozhraní .NET |
✔️ Při návrhu nových typů uvažujte o serializaci.
Vybrat technologii vpravo serializace pro podporu
✔️ ZVAŽTE podporu serializace kontraktů dat, pokud by instance vašeho typu mohly být trvalé nebo použity ve webových službách.
✔️ ZVAŽTE podporu serializace XML namísto nebo kromě serializace kontraktu dat, pokud potřebujete větší kontrolu nad formát XML, který je vytvořen při serializaci typu.
To může být nezbytné v některých scénářích interoperability, kdy potřebujete použít konstruktor XML, který není podporován serializací kontraktů dat, například k vytvoření atributů XML.
✔️ ZVAŽTE podporu serializace modulu runtime, pokud instance vašeho typu potřebují cestovat přes hranice vzdálené komunikace .NET.
❌ Vyhněte se podpoře serializace runtime nebo serializace XML pouze z obecných důvodů trvalosti. Raději upřednostněte serializaci kontraktů dat.
Podpůrné smlouvy serializaci dat
Typy mohou podporovat serializaci kontraktů dat použitím DataContractAttribute typu a DataMemberAttribute členů (polí a vlastností) typu.
✔️ Zvažte označení datových členů vašeho typu veřejné, pokud je možné tento typ použít v částečném vztahu důvěryhodnosti.
V plné důvěryhodnosti mohou serializátory kontraktu data serializovat a deserializovat nepublikované typy a členy, ale pouze veřejné členy lze serializovat a deserializovat v částečné důvěryhodnosti.
✔️ Implementujte metodu getter a setter ve všech vlastnostech, které mají DataMemberAttribute. Serializátory kontraktu dat vyžadují metodu getter i setter pro typ, který má být považován za serializovatelný. (V rozhraní .NET Framework 3.5 SP1 lze některé vlastnosti kolekce získat pouze.) Pokud typ nebude použit v částečném vztahu důvěryhodnosti, může být jeden nebo oba přístupové objekty vlastnosti nepublikované.
✔️ ZVAŽTE použití zpětného volání serializace pro inicializaci deserializovaných instancí.
Konstruktory nejsou volána, když jsou objekty deserializovat. (Existují výjimky pravidla. Konstruktory kolekcí označených CollectionDataContractAttribute pomocí jsou volány během deserializace.) Proto je potřeba implementovat jakoukoli logiku, která se provádí během normální výstavby, jako jeden ze zpětných volání serializace.
OnDeserializedAttribute
je nejčastěji používaný atribut zpětného volání. Další atributy řady jsou OnDeserializingAttribute, OnSerializingAttribute, a OnSerializedAttribute. Jejich lze použít k označení zpětná volání, které získat spuštěny před deserializace před serializací a nakonec po serializaci, v uvedeném pořadí.
✔️ ZVAŽTE použití KnownTypeAttribute k označení konkrétních typů, které by se měly použít při deserializaci komplexního objektového grafu.
✔️ Zvažte zpětnou a dopředu kompatibilitu při vytváření nebo změně serializovatelných typů.
Mějte na paměti, kterou serializovat datových proudů budoucí verze vašeho typu lze deserializovat do aktuální verze typu a naopak.
Ujistěte se, že rozumíte tomu, že členové dat, i soukromé a interní, nemohou změnit jejich názvy, typy nebo dokonce jejich pořadí v budoucích verzích typu, pokud se nezachovají zvláštní opatrnosti při zachování kontraktu pomocí explicitních parametrů pro atributy kontraktu dat.
Test kompatibility serializace při provádění změn serializovatelných typů. Zkuste deserializaci na novou verzi do starší verze a naopak.
✔️ ZVAŽTE implementaci, IExtensibleDataObject aby bylo možné přecházení mezi různými verzemi typu.
Rozhraní umožňuje serializátor zajistit, aby žádná data nejsou ztracena během verzemi. Vlastnost IExtensibleDataObject.ExtensionData se používá k ukládání dat z budoucí verze typu, který je neznámý pro aktuální verzi, a proto ji nelze uložit do svých datových členů. Pokud je aktuální verze následně serializována a deserializována do budoucí verze, budou další data k dispozici v serializovaném datovém proudu.
Podpora serializace XML
Serializace kontraktů dat je hlavní (výchozí) serializace technologie v rozhraní .NET Framework, ale existují scénáře serializace, které serializace kontraktu dat nepodporuje. Můžete například ji vám neuděluje plnou kontrolu nad tvar XML vytvořeného nebo používané serializátor. Pokud je takové jemné řízení požadováno, musí být použita serializace XML a musíte navrhnout své typy tak, aby podporovaly tuto serializační technologii.
❌ Vyhněte se návrhu typů speciálně pro serializaci XML, pokud nemáte velmi silný důvod k řízení tvaru vytvořeného XML. Tato technologie serializace bylo nahrazeno serializaci smlouvy dat, který je popsána v předchozím oddílu.
✔️ ZVAŽTE implementaci IXmlSerializable rozhraní, pokud chcete ještě větší kontrolu nad tvarem serializovaného XML než to, co nabízí použití atributů serializace XML. Dvě metody rozhraní ReadXml a WriteXml, umožňují plně řídit serializovaný XML stream. Můžete také řídit schéma XML, které se vygeneruje pro typ použitím XmlSchemaProviderAttribute
.
Podpora modulu Runtime serializace
Serializace za běhu je technologie používaná vzdálené komunikace .NET. Pokud si myslíte, že se vaše typy budou přenášet pomocí vzdálené komunikace .NET, musíte se ujistit, že podporují serializaci runtime.
Základní podporu serializace modulu runtime lze poskytnout použitím SerializableAttributea pokročilejší scénáře zahrnují implementaci jednoduchého serializovatelného vzoru runtime (implementace ISerializable a poskytnutí konstruktor serializace).
✔️ ZVAŽTE podporu serializace modulu runtime, pokud se vaše typy použijí se vzdálené komunikace .NET. Obor názvů například System.AddIn používá vzdálené komunikace .NET, takže všechny typy vyměňované mezi System.AddIn
doplňky musí podporovat serializaci modulu runtime.
✔️ ZVAŽTE implementaci modelu serializovatelného modulu runtime, pokud chcete úplnou kontrolu nad procesem serializace. Například pokud chcete transformovat data jako jeho získá serializován nebo deserializován.
Vzor je velmi snadné. Vše je třeba provést je implementovat ISerializable rozhraní a zadat speciální konstruktor, který se používá, pokud je objekt deserializován.
✔️ Do make the serialization constructor protected and provide two parameters typed and named přesně tak, jak je znázorněno v ukázce zde.
[Serializable]
public class Person : ISerializable
{
protected Person(SerializationInfo info, StreamingContext context)
{
// ...
}
}
✔️ Implementujte ISerializable členy explicitně.
✔️ Do apply a link demand to ISerializable.GetObjectData implementation. Tím se zajistí, že k členu mají přístup pouze plně důvěryhodné jádro a serializátor runtime.
© Části 2005, 2009 Microsoft Corporation. Všechna práva vyhrazena.
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, published Oct 22, 2008 by Addison-Wesley Professional v rámci Microsoft Windows Development Series.