Sdílet prostřednictvím


System.Runtime.Serialization.DataContractSerializer – třída

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

DataContractSerializer Pomocí třídy serializovat a deserializovat instance typu do datového proudu XML nebo dokumentu. Můžete například vytvořit typ s názvem Person s vlastnostmi, které obsahují základní data, jako je název a adresa. Pak můžete vytvořit instanci Person třídy a zapsat všechny její hodnoty vlastností do dokumentu XML pro pozdější načtení nebo v datovém proudu XML pro okamžitý přenos. Nejdůležitější je, že DataContractSerializer se používá k serializaci a deserializaci dat odesílaných ve zprávách WCF (Windows Communication Foundation). DataContractAttribute Použijte atribut na třídy a DataMemberAttribute atribut na členy třídy určit vlastnosti a pole, které jsou serializovány.

Seznam typů, které lze serializovat, naleznete v části Typy podporované serializátorem kontraktu dat.

Chcete-li použít DataContractSerializer, nejprve vytvořte instanci třídy a objekt odpovídající zápisu nebo čtení formátu, například instance XmlDictionaryWriter. Potom zavolejte metodu WriteObject pro zachování dat. Pokud chcete načíst data, vytvořte objekt odpovídající pro čtení datového formátu (například XmlDictionaryReader pro dokument XML) a volejte metodu ReadObject .

Další informace o použití DataContractSerializernaleznete v tématu Serializace a deserializace.

Typ serializátoru kontraktu dat můžete nastavit pomocí <prvku dataContractSerializer> v konfiguračním souboru klientské aplikace.

Příprava tříd pro serializaci nebo deserializaci

Používá se DataContractSerializer v kombinaci s třídami a DataMemberAttribute třídamiDataContractAttribute. Chcete-li připravit třídu pro serializaci, použijte ji DataContractAttribute na třídu. Pro každého člena třídy, který vrací data, která chcete serializovat, použijte DataMemberAttribute. Pole a vlastnosti můžete serializovat bez ohledu na přístupnost: soukromou, chráněnou, interní, chráněnou interní nebo veřejnou.

Například schéma určuje Customer vlastnost s ID vlastností, ale již máte existující aplikaci, která používá typ pojmenovaný PersonName s vlastností. Chcete-li vytvořit typ, který odpovídá smlouvě, nejprve použijte třídu DataContractAttribute . Potom použijte DataMemberAttribute u každého pole nebo vlastnosti, které chcete serializovat.

Poznámka:

Tuto možnost DataMemberAttribute můžete použít pro soukromé i veřejné členy.

Konečný formát XML nemusí být text. DataContractSerializer Místo toho zapisuje data jako informační sadu XML, která umožňuje zapisovat data do libovolného formátu rozpoznaného operátorem XmlReader a XmlWriter. Doporučujeme, abyste ke čtení a zápisu používali třídy XmlDictionaryReader , XmlDictionaryWriter protože oba jsou optimalizované pro práci s rozhraním DataContractSerializer.

Pokud vytváříte třídu s poli nebo vlastnostmi, které musí být vyplněny před serializací nebo deserializace, použijte atributy zpětného volání, jak je popsáno v zpětných voláních serializace odolné proti verzi.

Přidání do kolekce známých typů

Při serializaci nebo deserializaci objektu je nutné, aby typ je "známý" pro DataContractSerializerobjekt . Začněte vytvořením instance třídy, která implementuje IEnumerable<T> (například List<T>) a přidá známé typy do kolekce. Pak vytvořte instanci DataContractSerializer pomocí jednoho z přetížení, která přebírá IEnumerable<T> (například DataContractSerializer(Type, IEnumerable<Type>)).

Poznámka:

Na rozdíl od jiných primitivních typů DateTimeOffset není struktura ve výchozím nastavení známým typem, takže je nutné ji ručně přidat do seznamu známých typů (viz Známé typy kontraktu dat).

Přesměrová kompatibilita

Rozumí DataContractSerializer datovým kontraktům, které byly navrženy tak, aby byly kompatibilní s budoucími verzemi kontraktu. Takové typy implementují IExtensibleDataObject rozhraní. Rozhraní obsahuje ExtensionData vlastnost, která vrací ExtensionDataObject objekt. Další informace najdete v tématu Kontrakty dat kompatibilní s předáváním.

Spuštění pod částečným vztahem důvěryhodnosti

Při vytváření instance cílového objektu během deserializace DataContractSerializer nevolá konstruktor cílového objektu. Pokud vytváříte typ [DataContract], který je přístupný z částečného vztahu důvěryhodnosti (to znamená, že je veřejný a v sestavení s AllowPartiallyTrustedCallers použitým atributem) a který provádí některé akce související se zabezpečením, musíte mít na paměti, že konstruktor není volána. Zejména následující techniky nefungují:

  • Pokud se pokusíte omezit částečný přístup důvěryhodnosti vytvořením interního nebo privátního konstruktoru nebo přidáním LinkDemand konstruktoru – žádná z těchto možností nemá žádný vliv při deserializaci v rámci částečné důvěryhodnosti.
  • Pokud zakódujete třídu, která předpokládá, že konstruktor má spuštěný, třída se může dostat do neplatného interního stavu, který je zneužitelný.