Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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á trvalost Webové služby JSON – JavaScript Object Notation |
| 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 .NET |
✔️ Při návrhu nových typů uvažujte o serializaci.
Volba správné technologie 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 XML serializace namísto nebo kromě serializace kontraktu dat, pokud potřebujete větší kontrolu nad formátem 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.
Podpora serializace kontraktů 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 datového typu jako veřejnými, pokud je možné tento typ použít v prostředí částečné důvěry.
Při plné důvěře mohou serializátory Kontraktu dat serializovat a deserializovat neveřejné typy a členy, ale pouze veřejné členy lze serializovat a deserializovat při částečné důvěře.
✔️ 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 kolekcí pouze získat.) Pokud typ nebude použit v omezené důvěryhodnosti, může být jeden nebo oba přístupové metody vlastnosti neveřejné.
✔️ ZVAŽTE použití zpětného volání serializace pro inicializaci deserializovaných instancí.
Konstruktory nejsou volány při deserializaci objektů. (Existují výjimky pravidla. Konstruktory kolekcí označených CollectionDataContractAttribute jsou volány během deserializace.) Proto je potřeba implementovat jakoukoli logiku, která se provádí během normální konstrukce, jako jedno ze zpětných volání pro serializaci.
OnDeserializedAttribute je nejčastěji používaný atribut zpětného volání. Ostatní atributy v rodině jsou OnDeserializingAttribute, OnSerializingAttributea OnSerializedAttribute. Lze je použít k označení zpětných volání, které se spustí před deserializací, před serializací a nakonec po serializaci.
✔️ 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, že serializované datové proudy budoucích verzí vašeho typu lze deserializovat do aktuální verze typu a naopak.
Ujistěte se, že rozumíte tomu, že datoví členové, i soukromí a interní, nemohou změnit jejich názvy, typy nebo dokonce jejich pořadí v budoucích verzích typu, pokud se nezachová zvláštní péči při zachování kontraktu pomocí explicitních parametrů datových kontraktních atributů.
Test kompatibility serializace při provádění změn serializovatelných typů. Zkuste deserializovat novou verzi do starší verze a naopak.
✔️ Zvažte implementaci IExtensibleDataObject umožňující přecházení mezi různými verzemi typu.
Rozhraní umožňuje serializátoru zajistit, aby se během cyklického přenosu dat neztratila žádná data. 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
Datová kontraktová serializace je hlavní (výchozí) technologie serializace v rámci .NET Framework, ale existují scénáře serializace, které datová kontraktová serializace nepodporuje. Například neposkytuje úplnou kontrolu nad tvarem XML vytvořeného nebo spotřebovaného serializátorem. 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 byla nahrazena serializací kontraktu dat popsanou v předchozí části.
✔️ 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 serializace za běhu
Serializace za běhu času je technologie používaná pro .NET Remoting. 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 SerializableAttribute, a pokročilejší scénáře zahrnují implementaci jednoduchého vzoru pro serializaci runtime (implementace ISerializable a poskytnutí konstruktoru pro serializaci).
✔️ Zvažte podporu serializace za běhu, pokud se vaše typy použijí s .NET Remoting. Obor názvů System.AddIn například používá .NET Remoting, takže všechny typy vyměňované mezi doplňky System.AddIn musí podporovat serializaci za běhu.
✔️ ZVAŽTE implementaci modelu serializovatelného modulu runtime, pokud chcete úplnou kontrolu nad procesem serializace. Pokud například chcete transformovat data, když dochází k jejich serializaci nebo deserializaci.
Vzor je velmi jednoduchý. Stačí implementovat ISerializable rozhraní a poskytnout speciální konstruktor, který se používá při deserializaci objektu.
✔️ Udělejte konstruktor serializace chráněný a poskytněte dva parametry, které jsou typizovány a pojmenovány přesně tak, jak je uvedeno v ukázce.
[Serializable]
public class Person : ISerializable
{
protected Person(SerializationInfo info, StreamingContext context)
{
// ...
}
}
✔️ Implementujte ISerializable členy explicitně.
✔️ Použijte požadavek na odkaz na implementaci ISerializable.GetObjectData. Tím se zajistí, že k členu mají přístup pouze plně důvěryhodné jádro a serializér běhového prostředí.
Části z © 2005, 2009 Microsoft Corporation. Všechna práva vyhrazena.
Přetištěno se svolením Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition od Krzysztofa Cwaliny a Brada Abramse, vydáno 22. října 2008 nakladatelstvím Addison-Wesley Professional jako součást série Microsoft Windows Development.