Serializace a deserializace
Windows Communication Foundation (WCF) obsahuje nový serializační modul , the DataContractSerializer. Překládá DataContractSerializer se mezi objekty rozhraní .NET Framework a XML v obou směrech. Toto téma vysvětluje, jak serializátor funguje.
Při serializaci objektů rozhraní .NET Framework serializátor rozumí řadě programovacích modelů serializace, včetně nového modelu kontraktu dat. Úplný seznam podporovaných typů naleznete v části Typy podporované serializátorem kontraktu dat. Úvod k datovým kontraktům najdete v tématu Použití kontraktů dat.
Při deserializaci XML serializátor používá XmlReader a XmlWriter třídy. Podporuje také XmlDictionaryReader a XmlDictionaryWriter třídy, které jí umožňují vytvářet optimalizované XML v některých případech, například při použití binárního formátu XML WCF.
WCF také obsahuje doprovodný serializátor , the NetDataContractSerializer. Pomocná rutina NetDataContractSerializer:
- Není zabezpečený. Další informace naleznete v průvodci zabezpečením BinaryFormatter.
- BinaryFormatter Podobá se serializátorům a SoapFormatter serializátorům, protože také generuje názvy typů rozhraní .NET Framework jako součást serializovaných dat.
- Používá se, pokud jsou stejné typy sdíleny na serializaci a deserializace končí.
Obě DataContractSerializer a NetDataContractSerializer odvozeny od společné základní třídy , XmlObjectSerializer.
Upozorňující
Serializuje DataContractSerializer řetězce obsahující řídicí znaky s šestnáctkovou hodnotou nižší než 20 jako entity XML. To může způsobit problém s jiným klientem než WCF při odesílání těchto dat do služby WCF.
Vytvoření instance DataContractSerializer
Vytvoření instance objektu DataContractSerializer je důležitým krokem. Po konstrukci nemůžete změnit žádné nastavení.
Zadání kořenového typu
Kořenový typ je typ , jehož instance jsou serializovány nebo deserializovány. Má DataContractSerializer mnoho přetížení konstruktoru, ale minimálně musí být pomocí parametru type
zadán kořenový typ.
Serializátor vytvořený pro určitý kořenový typ nelze použít k serializaci (nebo deserializaci) jiného typu, pokud typ není odvozen od kořenového typu. Následující příklad ukazuje dvě třídy.
[DataContract]
public class Person
{
// Code not shown.
}
[DataContract]
public class PurchaseOrder
{
// Code not shown.
}
<DataContract()> _
Public Class Person
' Code not shown.
End Class
<DataContract()> _
Public Class PurchaseOrder
' Code not shown.
End Class
Tento kód vytvoří instanci DataContractSerializer
, kterou lze použít pouze k serializaci nebo deserializaci instancí Person
třídy.
DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
// This can now be used to serialize/deserialize Person but not PurchaseOrder.
Dim dcs As New DataContractSerializer(GetType(Person))
' This can now be used to serialize/deserialize Person but not PurchaseOrder.
Určení známých typů
Pokud se polymorfismus podílí na serializovaných typech, které ještě nejsou zpracovávány pomocí atributu KnownTypeAttribute nebo jiného mechanismu, musí být seznam možných typů předán serializátoru pomocí parametru knownTypes
. Další informace o známýchtypech
Následující příklad ukazuje třídu , která LibraryPatron
zahrnuje kolekci určitého typu, the LibraryItem
. Druhá třída definuje LibraryItem
typ. Třetí a čtyři třídy (Book
a Newspaper
) dědí z LibraryItem
třídy.
[DataContract]
public class LibraryPatron
{
[DataMember]
public LibraryItem[] borrowedItems;
}
[DataContract]
public class LibraryItem
{
// Code not shown.
}
[DataContract]
public class Book : LibraryItem
{
// Code not shown.
}
[DataContract]
public class Newspaper : LibraryItem
{
// Code not shown.
}
<DataContract()> _
Public Class LibraryPatron
<DataMember()> _
Public borrowedItems() As LibraryItem
End Class
<DataContract()> _
Public Class LibraryItem
' Code not shown.
End Class
<DataContract()> _
Public Class Book
Inherits LibraryItem
' Code not shown.
End Class
<DataContract()> _
Public Class Newspaper
Inherits LibraryItem
' Code not shown.
End Class
Následující kód vytvoří instanci serializátoru pomocí parametru knownTypes
.
// Create a serializer for the inherited types using the knownType parameter.
Type[] knownTypes = new Type[] { typeof(Book), typeof(Newspaper) };
DataContractSerializer dcs =
new DataContractSerializer(typeof(LibraryPatron), knownTypes);
// All types are known after construction.
' Create a serializer for the inherited types using the knownType parameter.
Dim knownTypes() As Type = {GetType(Book), GetType(Newspaper)}
Dim dcs As New DataContractSerializer(GetType(LibraryPatron), knownTypes)
' All types are known after construction.
Zadání výchozího kořenového názvu a oboru názvů
Při serializaci objektu se obvykle určuje výchozí název a obor názvů vnějšího elementu XML podle názvu datového kontraktu a oboru názvů. Názvy všech vnitřních prvků jsou určeny z názvů členů dat a jejich obor názvů je obor názvů datového kontraktu. Následující příklad nastaví Name
a Namespace
hodnoty v konstruktorech DataContractAttribute a DataMemberAttribute tříd.
[DataContract(Name = "PersonContract", Namespace = "http://schemas.contoso.com")]
public class Person2
{
[DataMember(Name = "AddressMember")]
public Address theAddress;
}
[DataContract(Name = "AddressContract", Namespace = "http://schemas.contoso.com")]
public class Address
{
[DataMember(Name = "StreetMember")]
public string street;
}
<DataContract(Name:="PersonContract", [Namespace]:="http://schemas.contoso.com")> _
Public Class Person2
<DataMember(Name:="AddressMember")> _
Public theAddress As Address
End Class
<DataContract(Name:="AddressContract", [Namespace]:="http://schemas.contoso.com")> _
Public Class Address
<DataMember(Name:="StreetMember")> _
Public street As String
End Class
Serializace instance Person
třídy vytvoří XML podobný následujícímu.
<PersonContract xmlns="http://schemas.contoso.com">
<AddressMember>
<StreetMember>123 Main Street</StreetMember>
</AddressMember>
</PersonContract>
Výchozí název a obor názvů kořenového prvku však můžete přizpůsobit předáním hodnot rootName
parametrů konstruktoruDataContractSerializer.rootNamespace
Všimněte si, že rootNamespace
nemá vliv na obor názvů obsažených prvků, které odpovídají datovým členům. Ovlivňuje pouze obor názvů vnějšího prvku.
Tyto hodnoty lze předat jako řetězce nebo instance XmlDictionaryString třídy, aby bylo možné jejich optimalizaci pomocí binárního formátu XML.
Nastavení maximální kvóty objektů
Některé DataContractSerializer
přetížení konstruktoru maxItemsInObjectGraph
mají parametr. Tento parametr určuje maximální počet objektů serializátor serializace nebo deserializes v jednom ReadObject volání metody. (Metoda vždy čte jeden kořenový objekt, ale tento objekt může mít jiné objekty ve svých datových členech. Tyto objekty mohou mít jiné objekty atd.) Výchozí hodnota je 65536. Všimněte si, že při serializaci nebo deserializaci polí se každá položka pole počítá jako samostatný objekt. Všimněte si také, že některé objekty můžou mít velkou reprezentaci paměti, a proto samotná kvóta nemusí být dostatečná, aby se zabránilo útoku na dostupnost služby. Další informace najdete v tématu Důležité informace o zabezpečení dat. Pokud potřebujete tuto kvótu zvýšit nad výchozí hodnotu, je důležité to udělat jak na straně odesílání (serializace), tak na straně příjmu (deserializace), protože platí pro čtení i zápis dat.
Doba odezvy
Kruhová cesta nastane, když je objekt deserializován a re serializován v jedné operaci. Proto jde z XML na instanci objektu a zpět do datového proudu XML.
Některá DataContractSerializer
přetížení konstruktoru ignoreExtensionDataObject
mají parametr, který je nastavený false
ve výchozím nastavení. V tomto výchozím režimu je možné data odeslat na zpáteční cestu z novější verze kontraktu dat prostřednictvím starší verze a zpět na novější verzi bez ztráty, pokud kontrakt dat implementuje IExtensibleDataObject rozhraní. Předpokládejme například, že verze 1 datového kontraktu Person
obsahuje Name
členy a PhoneNumber
datové členy a verze 2 přidá člena Nickname
. Pokud IExtensibleDataObject
je implementováno, při odesílání informací z verze 2 do verze 1 jsou Nickname
data uložena a pak se znovu vygenerují při opětovném serializaci dat. Proto se při odezvě neztratí žádná data. Další informace najdete v tématu Kontrakty dat kompatibilní s předáváním a verzí kontraktů dat.
Aspekty platnosti zabezpečení a schématu při odezvě
Odezvy můžou mít vliv na zabezpečení. Příkladem může být deserializace a ukládání velkých objemů nadbytečných dat bezpečnostní riziko. Může se jednat o bezpečnostní obavy týkající se opětovného generování těchto dat, že neexistuje způsob, jak ověřit, zejména v případě, že se týkají digitálních podpisů. Například v předchozím scénáři by koncový bod verze 1 mohl podepisovat Nickname
hodnotu, která obsahuje škodlivá data. A konečně může docházet k obavám ohledně platnosti schématu: Koncový bod může vždy generovat data, která striktně dodržuje jeho stavový kontrakt, a ne žádné dodatečné hodnoty. V předchozím příkladu kontrakt koncového bodu verze 1 říká, že generuje pouze Name
a PhoneNumber
, a pokud se používá ověření schématu, vygenerování dodatečné Nickname
hodnoty způsobí selhání ověření.
Povolení a zakázání odezvy
Pokud chcete vypnout odezvy IExtensibleDataObject , neimplementujte rozhraní. Pokud nemáte žádnou kontrolu nad typy, nastavte ignoreExtensionDataObject
parametr tak, aby true
dosáhl stejného efektu.
Zachování grafu objektů
Serializátor obvykle nezajímá identitu objektu, jako v následujícím kódu.
[DataContract]
public class PurchaseOrder
{
[DataMember]
public Address billTo;
[DataMember]
public Address shipTo;
}
[DataContract]
public class Address
{
[DataMember]
public string street;
}
<DataContract()> _
Public Class PurchaseOrder
<DataMember()> _
Public billTo As Address
<DataMember()> _
Public shipTo As Address
End Class
<DataContract()> _
Public Class Address
<DataMember()> _
Public street As String
End Class
Následující kód vytvoří nákupní objednávku.
// Construct a purchase order:
Address adr = new Address();
adr.street = "123 Main St.";
PurchaseOrder po = new PurchaseOrder();
po.billTo = adr;
po.shipTo = adr;
' Construct a purchase order:
Dim adr As New Address()
adr.street = "123 Main St."
Dim po As New PurchaseOrder()
po.billTo = adr
po.shipTo = adr
Všimněte si, že billTo
pole jsou shipTo
nastavená na stejnou instanci objektu. Vygenerovaný KÓD XML však duplikuje informace duplikované a vypadá podobně jako následující XML.
<PurchaseOrder>
<billTo><street>123 Main St.</street></billTo>
<shipTo><street>123 Main St.</street></shipTo>
</PurchaseOrder>
Tento přístup má však následující charakteristiky, které mohou být nežádoucí:
Výkon. Replikace dat je neefektivní.
Cyklické odkazy. Pokud se objekty odkazují na sebe, i přes jiné objekty, serializace replikací vede k nekonečné smyčce. (Serializátor vyvolá SerializationException chybu, pokud k tomu dojde.)
Sémantika. Někdy je důležité zachovat skutečnost, že dva odkazy jsou na stejný objekt, a ne na dva identické objekty.
Z těchto důvodů mají některá DataContractSerializer
přetížení konstruktoru preserveObjectReferences
parametr (výchozí hodnota je false
). Pokud je tento parametr nastaven na true
, speciální metoda kódování odkazy na objekty, která pouze WCF rozumí, je použita. Když je nastavená hodnota true
, příklad kódu XML teď vypadá podobně jako následující.
<PurchaseOrder ser:id="1">
<billTo ser:id="2"><street ser:id="3">123 Main St.</street></billTo>
<shipTo ser:ref="2"/>
</PurchaseOrder>
Obor názvů "ser" odkazuje na standardní serializační obor názvů, http://schemas.microsoft.com/2003/10/Serialization/
. Každá část dat je serializována pouze jednou a zadanou číslem ID a následná použití vede k odkazu na již serializovaná data.
Důležité
Pokud jsou v kontraktu XMLElement
dat přítomny atributy "id" i "ref", je atribut "ref" dodržen a atribut "id" bude ignorován.
Je důležité pochopit omezení tohoto režimu:
XML
DataContractSerializer
vytvoří sepreserveObjectReferences
sadoutrue
není interoperabilní s žádnými dalšími technologiemi a lze k němu přistupovat pouze jinouDataContractSerializer
instancí, také s nastavenoupreserveObjectReferences
natrue
.Pro tuto funkci není podporována žádná metadata (schéma). Schéma, které je vytvořeno, je platné pouze pro případ, kdy
preserveObjectReferences
je nastavena nafalse
.Tato funkce může způsobit pomalejší proces serializace a deserializace. I když data nemusí být replikována, musí se v tomto režimu provádět další porovnání objektů.
Upozornění
preserveObjectReferences
Pokud je režim povolený, je obzvláště důležité nastavit maxItemsInObjectGraph
hodnotu na správnou kvótu. Vzhledem ke způsobu zpracování polí v tomto režimu je pro útočníka snadné vytvořit malou škodlivou zprávu, která vede k velkému využití paměti omezené pouze kvótou maxItemsInObjectGraph
.
Určení náhradního kontraktu dat
Některé DataContractSerializer
přetížení konstruktoru dataContractSurrogate
mají parametr, který může být nastaven na null
. V opačném případě ji můžete použít k určení náhradního kontraktu IDataContractSurrogate dat, což je typ, který implementuje rozhraní. Rozhraní pak můžete použít k přizpůsobení serializace a deserializace procesu. Další informace naleznete v tématu Náhradní smlouvy dat.
Serializace
Následující informace platí pro všechny třídy, které dědí z XmlObjectSerializertřídy , včetně a DataContractSerializerNetDataContractSerializer tříd.
Jednoduchá serializace
Nejzásadnější způsob serializace objektu je předat ho metodě WriteObject . Existují tři přetížení, jedna pro zápis do Stream, nebo XmlWriterXmlDictionaryWriter. Stream Při přetížení je výstup XML v kódování UTF-8. XmlDictionaryWriter Při přetížení serializátor optimalizuje svůj výstup pro binární XML.
Při použití WriteObject metody serializátor používá výchozí název a obor názvů pro element obálky a zapíše ho spolu s obsahem (viz předchozí část "Určení výchozího kořenového názvu a oboru názvů").
Následující příklad ukazuje psaní pomocí .XmlDictionaryWriter
Person p = new Person();
DataContractSerializer dcs =
new DataContractSerializer(typeof(Person));
XmlDictionaryWriter xdw =
XmlDictionaryWriter.CreateTextWriter(someStream,Encoding.UTF8 );
dcs.WriteObject(xdw, p);
Dim p As New Person()
Dim dcs As New DataContractSerializer(GetType(Person))
Dim xdw As XmlDictionaryWriter = _
XmlDictionaryWriter.CreateTextWriter(someStream, Encoding.UTF8)
dcs.WriteObject(xdw, p)
Tím se vytvoří kód XML podobný následujícímu.
<Person>
<Name>Jay Hamlin</Name>
<Address>123 Main St.</Address>
</Person>
Podrobná serializace
WriteStartObjectPoužití , WriteObjectContenta WriteEndObject metody k zápisu koncového elementu, zápis obsahu objektu a uzavření obálky elementu, v uvedeném pořadí.
Poznámka:
Tyto metody nepřetěžují Stream .
Tato podrobná serializace má dvě společná použití. Jedním z nich je vložit obsah, jako jsou atributy nebo komentáře mezi WriteStartObject
a WriteObjectContent
, jak je znázorněno v následujícím příkladu.
dcs.WriteStartObject(xdw, p);
xdw.WriteAttributeString("serializedBy", "myCode");
dcs.WriteObjectContent(xdw, p);
dcs.WriteEndObject(xdw);
dcs.WriteStartObject(xdw, p)
xdw.WriteAttributeString("serializedBy", "myCode")
dcs.WriteObjectContent(xdw, p)
dcs.WriteEndObject(xdw)
Tím se vytvoří kód XML podobný následujícímu.
<Person serializedBy="myCode">
<Name>Jay Hamlin</Name>
<Address>123 Main St.</Address>
</Person>
Dalším běžným použitím je vyhnout se použití WriteStartObject a WriteEndObject zcela a psaní vlastního elementu obálky (nebo dokonce přeskočit psaní obálky úplně), jak je znázorněno v následujícím kódu.
xdw.WriteStartElement("MyCustomWrapper");
dcs.WriteObjectContent(xdw, p);
xdw.WriteEndElement();
xdw.WriteStartElement("MyCustomWrapper")
dcs.WriteObjectContent(xdw, p)
xdw.WriteEndElement()
Tím se vytvoří kód XML podobný následujícímu.
<MyCustomWrapper>
<Name>Jay Hamlin</Name>
<Address>123 Main St.</Address>
</MyCustomWrapper>
Poznámka:
Při použití podrobné serializace může dojít k neplatnému schématu XML.
Rekonstrukci
Následující informace platí pro všechny třídy, které dědí z XmlObjectSerializertřídy , včetně a DataContractSerializerNetDataContractSerializer tříd.
Nejzásadnější způsob deserializace objektu je volání jednoho z ReadObject přetížení metody. Existují tři přetížení, jedna pro čtení s XmlDictionaryReader, nebo XmlReader
Stream
. Všimněte si, že Stream
přetížení vytvoří textový text XmlDictionaryReader , který není chráněn žádnými kvótami, a měl by být použit pouze ke čtení důvěryhodných dat.
Všimněte si také, že objekt, který ReadObject
metoda vrací, musí být přetypován na příslušný typ.
Následující kód vytvoří instanci DataContractSerializer a a XmlDictionaryReaderpak deserializuje Person
instanci.
DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
FileStream fs = new FileStream(path, FileMode.Open);
XmlDictionaryReader reader =
XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
Person p = (Person)dcs.ReadObject(reader);
Dim dcs As New DataContractSerializer(GetType(Person))
Dim fs As New FileStream(path, FileMode.Open)
Dim reader As XmlDictionaryReader = _
XmlDictionaryReader.CreateTextReader(fs, New XmlDictionaryReaderQuotas())
Dim p As Person = CType(dcs.ReadObject(reader), Person)
Před voláním ReadObject metody umístěte čtečku XML na element obálky nebo na uzel bez obsahu, který předchází elementu obálky. Můžete to provést voláním Read metody XmlReader nebo jeho odvození a testováním NodeType, jak je znázorněno v následujícím kódu.
DataContractSerializer ser = new DataContractSerializer(typeof(Person),
"Customer", @"http://www.contoso.com");
FileStream fs = new FileStream(path, FileMode.Open);
XmlDictionaryReader reader =
XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if (ser.IsStartObject(reader))
{
Console.WriteLine("Found the element");
Person p = (Person)ser.ReadObject(reader);
Console.WriteLine("{0} {1} id:{2}",
p.Name , p.Address);
}
Console.WriteLine(reader.Name);
break;
}
}
Dim ser As New DataContractSerializer(GetType(Person), "Customer", "http://www.contoso.com")
Dim fs As New FileStream(path, FileMode.Open)
Dim reader As XmlDictionaryReader = XmlDictionaryReader.CreateTextReader(fs, New XmlDictionaryReaderQuotas())
While reader.Read()
Select Case reader.NodeType
Case XmlNodeType.Element
If ser.IsStartObject(reader) Then
Console.WriteLine("Found the element")
Dim p As Person = CType(ser.ReadObject(reader), Person)
Console.WriteLine("{0} {1}", _
p.Name, p.Address)
End If
Console.WriteLine(reader.Name)
End Select
End While
Všimněte si, že atributy na tomto elementu obálky lze před předáním čtenáře přečíst ReadObject
.
Při použití jednoho z jednoduchých ReadObject
přetížení hledá deserializátor výchozí název a obor názvů v elementu obálky (viz předchozí část "Určení výchozího kořenového názvu a oboru názvů") a vyvolá výjimku, pokud najde neznámý prvek. V předchozím příkladu se očekává element obálky <Person>
. Metoda IsStartObject je volána k ověření, zda je čtenář umístěn na elementu, který je pojmenován podle očekávání.
Existuje způsob, jak zakázat tuto kontrolu názvu elementu obálky; některé přetížení ReadObject
metody přebírají logický parametr verifyObjectName
, který je nastaven ve true
výchozím nastavení. Při nastavení na false
hodnotu je název a obor názvů elementu obálky ignorován. To je užitečné pro čtení XML, který byl napsán pomocí podrobného serializačního mechanismu popsaného dříve.
Použití NetDataContractSerializer
Hlavní rozdíl mezi a DataContractSerializer
tím NetDataContractSerializer spočívá v tom, že DataContractSerializer
používá názvy kontraktů dat, zatímco NetDataContractSerializer
výstupy úplné sestavení rozhraní .NET Framework a názvy typů v serializovaném XML. To znamená, že mezi koncovými body serializace a deserializace musí být sdíleny přesně stejné typy. To znamená, že známý mechanismus typů není vyžadován s NetDataContractSerializer
tím, že přesné typy, které mají být deserializovány, jsou vždy známé.
Může však dojít k několika problémům:
Zabezpečení. Načte se jakýkoli typ nalezený v deserializovaném souboru XML. To lze zneužít k vynucení načítání škodlivých typů.
NetDataContractSerializer
Použití s nedůvěryhodnými daty by mělo být provedeno pouze v případě, že se používá Serializace Binder (pomocí Binder vlastnosti nebo parametru konstruktoru). Pořadač umožňuje načtení pouze bezpečných typů. Mechanismus Binderu je shodný s mechanismem, který se používá v System.Runtime.Serialization oboru názvů.Správa verzí. Použití úplných názvů typů a sestavení v jazyce XML výrazně omezuje způsob, jakým lze typy správě verzí. Nelze změnit následující: názvy typů, obory názvů, názvy sestavení a verze sestavení. Nastavení vlastnosti nebo parametru konstruktoru AssemblyFormat na Simple místo výchozí hodnoty Full umožňuje změny verze sestavení, ale ne pro obecné typy parametrů.
Interoperabilita: Vzhledem k tomu, že názvy typů a sestavení rozhraní .NET Framework jsou zahrnuty v jazyce XML, platformy jiné než rozhraní .NET Framework nemají přístup k výsledným datům.
Výkon. Zápis názvů typů a sestavení výrazně zvyšuje velikost výsledného XML.
Tento mechanismus je podobný binárnímu serializaci nebo serializaci PROTOKOLU SOAP používané vzdálené komunikace rozhraní .NET Framework (konkrétně, a BinaryFormatterSoapFormatter).
NetDataContractSerializer
Použití je podobné použití , DataContractSerializer
s následujícími rozdíly:
Konstruktory nevyžadují, abyste zadali kořenový typ. Můžete serializovat libovolný typ se stejnou instancí
NetDataContractSerializer
.Konstruktory nepřijímají seznam známých typů. Mechanismus známých typů není nutný, pokud jsou názvy typů serializovány do XML.
Konstruktory nepřijímají náhradní kontrakt dat. Místo toho přijímají parametr s ISurrogateSelector názvem
surrogateSelector
(který se mapuje na SurrogateSelector vlastnost). Jedná se o starší náhradní mechanismus.Konstruktory přijímají parametr,
assemblyFormat
FormatterAssemblyStyle který se mapuje na AssemblyFormat vlastnost. Jak je popsáno dříve, lze ji použít k vylepšení možností správy verzí serializátoru. To je stejné jako FormatterAssemblyStyle mechanismus v binární nebo SOAP serializace.Konstruktory přijímají StreamingContext parametr, který se mapuje
context
na Context vlastnost. Můžete ho použít k předání informací do typů serializovaných. Toto použití je stejné jako u mechanismu použitého StreamingContext v jiných System.Runtime.Serialization třídách.Deserialize A Serialize metody jsou aliasy pro metody WriteObject a ReadObject metody. Existují k zajištění konzistentnějšího programovacího modelu s binárním serializací nebo serializací SOAP.
Další informace o těchto funkcích naleznete v tématu Binární serializace.
Formáty XML, které a které DataContractSerializer
se používají, NetDataContractSerializer
nejsou obvykle kompatibilní. To znamená, že pokus o serializaci s jedním z těchto serializátorů a deserializace s druhým není podporovaný scénář.
Všimněte si také, že NetDataContractSerializer
výstupem není úplný typ rozhraní .NET Framework a název sestavení pro každý uzel v grafu objektu. Výstupem jsou informace pouze tam, kde jsou nejednoznačné. To znamená, že výstup na úrovni kořenového objektu a pro všechny polymorfní případy.