Szerializálás és deszerializálás
A Windows Communication Foundation (WCF) tartalmaz egy új szerializációs motort, a DataContractSerializer. A DataContractSerializer fordítás .NET-keretrendszer objektumok és XML között, mindkét irányban. Ez a témakör a szerializáló működését ismerteti.
.NET-keretrendszer objektumok szerializálásakor a szerializáló számos szerializációs programozási modellt ismer, beleértve az új adatszerződési modellt is. A támogatott típusok teljes listáját az Adatszerződés szerializálója által támogatott típusok című témakörben találja. Az adatszerződések bemutatása: Adatszerződések használata.
Az XML deszerializálásakor a szerializáló az és XmlWriter az XmlReader osztályokat használja. Emellett támogatja azokat az XmlDictionaryReader osztályokat is XmlDictionaryWriter , amelyek lehetővé teszik, hogy optimalizált XML-t állíthasson elő bizonyos esetekben, például a WCF bináris XML-formátum használatakor.
WCF is tartalmaz egy társ szerializáló, a NetDataContractSerializer. Az NetDataContractSerializer:
- Nem biztonságos. További információt a BinaryFormatter biztonsági útmutatójában talál.
- Hasonló a BinaryFormatter szerializálókhozSoapFormatter, mert .NET-keretrendszer típusneveket is bocsát ki a szerializált adatok részeként.
- Akkor használatos, ha ugyanazokat a típusokat osztja meg a szerializálás és a deszerializálás vége.
Mindkettő DataContractSerializer és NetDataContractSerializer egy közös alaposztályból származik, XmlObjectSerializer.
Figyelmeztetés
A DataContractSerializer szerializálja a vezérlőkarakterekből álló sztringeket, amelyek hexadecimális értéke 20 alatt van XML-entitásként. Ez problémát okozhat egy nem WCF-ügyféllel, amikor ilyen adatokat küld egy WCF-szolgáltatásnak.
DataContractSerializer-példány létrehozása
A példány DataContractSerializer létrehozása fontos lépés. Az építés után a beállítások egyikét sem módosíthatja.
A gyökértípus megadása
A gyökér típusa az a típus, amelynek példányai szerializálva vagy deszerializálva vannak. A DataContractSerializer konstruktor túlterhelt, de legalább egy gyökértípust kell megadni a type
paraméterrel.
Egy bizonyos gyökértípushoz létrehozott szerializáló nem használható egy másik típus szerializálására (vagy deszerializálására), kivéve, ha a típus a gyökértípusból származik. Az alábbi példa két osztályt mutat be.
[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
Ez a kód olyan példányt hoz létre, DataContractSerializer
amely csak az osztály példányainak szerializálására vagy deszerializálására Person
használható.
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.
Ismert típusok megadása
Ha a szerializálandó típusok polimorfizmussal vannak bevonva, amelyeket még nem kezelnek az KnownTypeAttribute attribútum vagy valamilyen más mechanizmus használatával, a lehetséges ismert típusok listáját át kell adni a szerializáló konstruktorának a knownTypes
paraméter használatával. Az ismert típusokról további információt az Adatszerződés ismert típusai című témakörben talál.
Az alábbi példa egy osztályt mutat be, LibraryPatron
amely egy adott típusú gyűjteményt tartalmaz, a .LibraryItem
A második osztály határozza meg a típust LibraryItem
. A harmadik és a négy osztály (Book
és Newspaper
) örököl az LibraryItem
osztálytól.
[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
Az alábbi kód a paraméter használatával hozza létre a szerializáló egy példányát 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.
Az alapértelmezett gyökérnév és névtér megadása
Általában egy objektum szerializálása esetén a legkülső XML-elem alapértelmezett neve és névtere az adatszerződés neve és névtere alapján lesz meghatározva. Az összes belső elem nevét az adattagok neve határozza meg, a névtér pedig az adatszerződés névtere. Az alábbi példakészletek Name
és Namespace
értékek az és DataMemberAttribute osztályok DataContractAttribute konstruktoraiban szerepelnek.
[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
Az osztály egy példányának szerializálása az Person
alábbihoz hasonló XML-t eredményez.
<PersonContract xmlns="http://schemas.contoso.com">
<AddressMember>
<StreetMember>123 Main Street</StreetMember>
</AddressMember>
</PersonContract>
A gyökérelem alapértelmezett nevét és névterét azonban testre szabhatja úgy, hogy a konstruktornak átadja a paraméterek és rootNamespace
a rootName
paraméterek értékeitDataContractSerializer. Vegye figyelembe, hogy a rootNamespace
névtér nem befolyásolja az adattagoknak megfelelő tartalmazott elemek névterét. Csak a legkülső elem névterére van hatással.
Ezek az értékek átadhatók az osztály sztringjeiként vagy példányaiként, hogy lehetővé tegyék XmlDictionaryString az optimalizálást a bináris XML-formátum használatával.
A Maximális objektumkvóta beállítása
Egyes DataContractSerializer
konstruktor-túlterhelések paraméterrel maxItemsInObjectGraph
rendelkeznek. Ez a paraméter határozza meg, hogy a szerializáló hány objektumot szerializál vagy deszerializál egyetlen ReadObject metódushívásban. (A metódus mindig beolvassa az egyik gyökérobjektumot, de előfordulhat, hogy az objektumnak más objektumai is vannak az adattagjaiban. Ezek az objektumok lehetnek más objektumok, és így tovább.) Az alapértelmezett érték 65536. Vegye figyelembe, hogy tömbök szerializálása vagy deszerializálása során minden tömbbejegyzés külön objektumként számít. Vegye figyelembe azt is, hogy egyes objektumok nagy memóriaképet tartalmazhatnak, ezért ez a kvóta önmagában nem elegendő a szolgáltatásmegtagadásos támadások megelőzéséhez. További információkért tekintse meg az adatok biztonsági szempontjait. Ha ezt a kvótát az alapértelmezett értéken túl kell növelnie, fontos, hogy a küldési (szerializálási) és a fogadási (deszerializálási) oldalon is ezt tegye, mert az adatok olvasása és írása során egyaránt érvényes.
Adatváltások
Körút akkor fordul elő, ha egy objektum deszerializálva és újra szerializálva van egy műveletben. Így az XML-ből egy objektumpéldányba kerül, majd vissza egy XML-adatfolyamba.
Egyes DataContractSerializer
konstruktorok túlterhelésének van egy ignoreExtensionDataObject
paramétere, amely alapértelmezés szerint be van állítva false
. Ebben az alapértelmezett módban az adatok elküldhetők egy adatszerződés újabb verziójából egy régebbi verzióról, és vissza az újabb verzióra veszteség nélkül, feltéve, hogy az adatszerződés megvalósítja az IExtensibleDataObject interfészt. Tegyük fel például, hogy az Person
adatszerződés 1. verziója tartalmazza az adattagokat és PhoneNumber
az Name
adattagokat, a 2- es verzió pedig hozzáad egy tagotNickname
. Ha IExtensibleDataObject
implementálva van, a 2. verzióról az 1. verzióra küldi az Nickname
adatokat, az adatok tárolása, majd az adatok ismételt szerializálása után újra ki lesz bocsátva, ezért a körút során nem vesznek el adatok. További információ: Továbbítással kompatibilis adatszerződések és adatszerződések verziószámozása.
Biztonsági és séma-érvényességi problémák a kerek utakkal kapcsolatban
A kerek utak biztonsági következményekkel járhatnak. A nagy mennyiségű felesleges adat deszerializálása és tárolása például biztonsági kockázatot jelenthet. Előfordulhat, hogy biztonsági aggályok merülnek fel az adatok újbóli kibocsátásával kapcsolatban, amelyet nem lehet ellenőrizni, különösen akkor, ha digitális aláírások is szerepelnek benne. Az előző forgatókönyvben például az 1- es verziójú végpont rosszindulatú adatokat tartalmazó értéket ír alá Nickname
. Végül előfordulhatnak séma-érvényességi problémák: előfordulhat, hogy egy végpont mindig olyan adatokat szeretne kibocsátani, amelyek szigorúan megfelelnek a megadott szerződésnek, és nem tartalmaznak további értékeket. Az előző példában az 1-es verziójú végpont szerződése azt mondja, hogy csak Name
az bocsát ki, és PhoneNumber
ha sémaérvényesítést használ, a többletérték Nickname
kibocsátása sikertelen érvényesítést okoz.
A kerek utak engedélyezése és letiltása
A körutazások kikapcsolásához ne implementálja a IExtensibleDataObject felületet. Ha nincs szabályozva a típusok felett, állítsa be a ignoreExtensionDataObject
paramétert úgy, hogy true
ugyanazt a hatást érje el.
Objektumdiagram megőrzése
A szerializálót általában nem érdekli az objektumdentitás, mint az alábbi kódban.
[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
Az alábbi kód létrehoz egy vásárlási rendelést.
// 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
Figyelje meg, hogy billTo
a shipTo
mezők ugyanarra az objektumpéldányra vannak beállítva. A létrehozott XML azonban duplikálja a duplikált információkat, és az alábbi XML-hez hasonlóan néz ki.
<PurchaseOrder>
<billTo><street>123 Main St.</street></billTo>
<shipTo><street>123 Main St.</street></shipTo>
</PurchaseOrder>
Ez a megközelítés azonban a következő jellemzőkkel rendelkezik, amelyek nemkívánatosak lehetnek:
Teljesítmény. Az adatok replikálása nem hatékony.
Körkörös hivatkozások. Ha az objektumok önmagukra hivatkoznak, még más objektumokon keresztül is, a replikációval történő szerializálás végtelen ciklust eredményez. (A szerializáló ad egy SerializationException , ha ez történik.)
Szemantika. Néha fontos megőrizni azt a tényt, hogy két hivatkozás ugyanarra az objektumra vonatkozik, nem pedig két azonos objektumra.
Ezen okok miatt egyes DataContractSerializer
konstruktor-túlterhelések paraméterrel preserveObjectReferences
rendelkeznek (az alapértelmezett érték).false
Ha ezt a paramétert true
állítja be, a rendszer egy speciális metódust használ az objektumhivatkozások kódolására, amelyet csak a WCF ismer. Ha be van true
állítva, az XML-kód példája a következőhöz hasonló.
<PurchaseOrder ser:id="1">
<billTo ser:id="2"><street ser:id="3">123 Main St.</street></billTo>
<shipTo ser:ref="2"/>
</PurchaseOrder>
A "ser" névtér a szabványos szerializálási névtérre utal. http://schemas.microsoft.com/2003/10/Serialization/
Minden egyes adat csak egyszer szerializálódik, és azonosítószámot ad meg, és a későbbi felhasználások a már szerializált adatokra mutató hivatkozást eredményeznek.
Fontos
Ha az "id" és a "ref" attribútum is szerepel az adatszerződésben XMLElement
, akkor a rendszer tiszteletben tartja a "ref" attribútumot, és figyelmen kívül hagyja az "id" attribútumot.
Fontos megérteni ennek a módnak a korlátait:
A készlettel előállított XML
DataContractSerializer
nem működik együtt más technológiákkal, és csak egy másikDataContractSerializer
példány érheti el, szintén a következőrepreserveObjectReferences
true
van állítva: .preserveObjectReferences
true
A szolgáltatás nem támogatja a metaadatokat (séma). A létrehozott séma csak arra az esetre érvényes, ha
preserveObjectReferences
a beállítás értékefalse
.Ez a funkció azt okozhatja, hogy a szerializálási és deszerializálási folyamat lassabban fut. Bár az adatokat nem kell replikálni, ebben a módban további objektum-összehasonlításokat kell végezni.
Figyelemfelhívás
Ha a preserveObjectReferences
mód engedélyezve van, különösen fontos, hogy az értéket a maxItemsInObjectGraph
megfelelő kvótára állítsa. Mivel a tömbök kezelése ebben a módban történik, a támadók könnyen hozhatnak létre egy kis kártékony üzenetet, amely nagy memóriahasználatot eredményez, amelyet csak a maxItemsInObjectGraph
kvóta korlátoz.
Adatszerződés helyettesítő megadása
Egyes DataContractSerializer
konstruktor-túlterhelések paraméterrel rendelkeznek dataContractSurrogate
, amelyek beállíthatók a következőre null
: . Ellenkező esetben adatszerződést adhat meg helyettesítőként, amely az interfészt megvalósító IDataContractSurrogate típus. Ezután a felülettel testre szabhatja a szerializálási és deszerializálási folyamatot. További információ: Adatszerződés-helyettesítők.
Szerializációs
Az alábbi információk minden olyan osztályra vonatkoznak, amely az XmlObjectSerializeradott osztálytól öröklődik, beleértve az osztályokat és NetDataContractSerializer az DataContractSerializer osztályokat is.
Egyszerű szerializálás
Az objektumok szerializálásának legalapvetőbb módja, ha átadja azt a WriteObject metódusnak. Három túlterhelés van, egy-egy írás egy Stream, egy XmlWritervagy egy XmlDictionaryWriter. Stream A túlterhelés miatt a kimenet XML az UTF-8 kódolásban. A túlterhelés miatt a XmlDictionaryWriter szerializáló a bináris XML-hez optimalizálja a kimenetét.
A metódus használatakor a WriteObject szerializáló a burkolóelem alapértelmezett nevét és névterét használja, és a tartalommal együtt írja ki (lásd az előző "Az alapértelmezett gyökérnév és névtér megadása" szakaszt).
Az alábbi példa bemutatja az írást egy 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)
Ez az alábbihoz hasonló XML-t hoz létre.
<Person>
<Name>Jay Hamlin</Name>
<Address>123 Main St.</Address>
</Person>
Részletes szerializálás
WriteStartObjectA záróelem írásához, az objektum tartalmának megírásához és a burkolóelem bezárásához használja a , WriteObjectContentés WriteEndObject a metódusokat.
Feljegyzés
Ezeknek a módszereknek nincsenek Stream túlterhelései.
Ennek a lépésenkénti szerializálásnak két gyakori felhasználási módja van. Az egyik az, hogy olyan tartalmakat szúr be, mint például az attribútumok vagy a megjegyzések WriteStartObject
WriteObjectContent
a következő példában látható módon.
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)
Ez az alábbihoz hasonló XML-t hoz létre.
<Person serializedBy="myCode">
<Name>Jay Hamlin</Name>
<Address>123 Main St.</Address>
</Person>
Egy másik gyakori felhasználási lehetőség a használat WriteStartObjectWriteEndObject és a teljes használat elkerülése, valamint a saját egyéni burkolóelem írása (vagy akár a burkoló teljes írásának kihagyása), ahogy az az alábbi kódban is látható.
xdw.WriteStartElement("MyCustomWrapper");
dcs.WriteObjectContent(xdw, p);
xdw.WriteEndElement();
xdw.WriteStartElement("MyCustomWrapper")
dcs.WriteObjectContent(xdw, p)
xdw.WriteEndElement()
Ez az alábbihoz hasonló XML-t hoz létre.
<MyCustomWrapper>
<Name>Jay Hamlin</Name>
<Address>123 Main St.</Address>
</MyCustomWrapper>
Feljegyzés
A lépésenkénti szerializálás séma érvénytelen XML-t eredményezhet.
Deszerializálás
Az alábbi információk minden olyan osztályra vonatkoznak, amely az XmlObjectSerializeradott osztálytól öröklődik, beleértve az osztályokat és NetDataContractSerializer az DataContractSerializer osztályokat is.
Az objektumok deszerializálásának legalapvetőbb módja az egyik metódus túlterhelésének ReadObject meghívása. Három túlterhelés van, egy-egy az olvasáshoz egy XmlDictionaryReader, egy XmlReader
vagy egy Stream
. Vegye figyelembe, hogy a Stream
túlterhelés olyan szöveges szöveget XmlDictionaryReader hoz létre, amelyet semmilyen kvóta nem véd, és csak megbízható adatok olvasására használható.
Azt is vegye figyelembe, hogy a ReadObject
metódus által visszaadott objektumot a megfelelő típusra kell leadni.
Az alábbi kód egy példányt DataContractSerializer és egy példányt XmlDictionaryReaderhoz létre, majd deszerializál egy példányt Person
.
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)
A metódus meghívása ReadObject előtt helyezze az XML-olvasót a burkolóelemre vagy a burkolóelemet megelőző nem tartalomcsomópontra. Ezt úgy teheti meg, hogy meghívja a Read származtatás metódusát XmlReader , és teszteli a NodeTypekövetkező kódban látható módon.
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
Vegye figyelembe, hogy a burkolóelem attribútumait elolvashatja, mielőtt átadja az olvasónak ReadObject
.
Az egyszerű ReadObject
túlterhelések egyikének használatakor a deszerializáló megkeresi a burkolóelem alapértelmezett nevét és névterét (lásd az előző, "Az alapértelmezett gyökérnév és névtér megadása" című szakaszt), és kivételt jelez, ha ismeretlen elemet talál. Az előző példában a <Person>
burkolóelem várható. A IsStartObject metódust annak ellenőrzésére hívjuk meg, hogy az olvasó a várt módon elnevezett elemen van-e elhelyezve.
A burkolóelemnév-ellenőrzés letiltására van mód; A ReadObject
metódus egyes túlterhelései az alapértelmezés szerint beállított logikai paramétert verifyObjectName
true
használják. Ha be van false
állítva, a burkolóelem neve és névtere figyelmen kívül lesz hagyva. Ez a korábban ismertetett lépésenkénti szerializálási mechanizmussal írt XML olvasásához hasznos.
A NetDataContractSerializer használata
Az és az DataContractSerializer
elsődleges különbség azNetDataContractSerializer, hogy az DataContractSerializer
adatszerződések neveit használja, míg a NetDataContractSerializer
kimenetek teljes .NET-keretrendszer szerelvényt és típusneveket a szerializált XML-ben. Ez azt jelenti, hogy pontosan ugyanazokat a típusokat kell megosztani a szerializálási és a deszerializálási végpontok között. Ez azt jelenti, hogy az ismert típusok mechanizmusára nincs szükség, NetDataContractSerializer
mivel a deszerializálandó pontos típusok mindig ismertek.
Azonban számos probléma fordulhat elő:
Biztonság. A deszerializálandó XML-fájlban található bármely típus betöltődik. Ez kihasználható a rosszindulatú típusok betöltésének kényszerítéséhez.
NetDataContractSerializer
A nem megbízható adatok használata csak szerializálási kötés használata esetén végezhető el (a tulajdonság vagy a Binder konstruktor paraméter használatával). A kötőanyag csak biztonságos típusok betöltését teszi lehetővé. A Binder mechanizmus megegyezik a névtérben System.Runtime.Serialization használt típusokkal.Verziószámozás. Ha teljes típus- és szerelvényneveket használ az XML-ben, az jelentősen korlátozza a típusok verziószámba vételét. A következő nem módosítható: típusnevek, névterek, szerelvénynevek és szerelvényverziók. A tulajdonság vagy a AssemblyFormat konstruktor paraméter Simple beállítása az alapértelmezett érték helyett lehetővé teszi a szerelvény verzióváltozásait Full , az általános paramétertípusok esetében azonban nem.
Együttműködési lehetőség. Mivel .NET-keretrendszer típus- és szerelvénynevek szerepelnek az XML-ben, a .NET-keretrendszer kívüli platformok nem férhetnek hozzá az eredményként kapott adatokhoz.
Teljesítmény. A típus- és szerelvénynevek írása jelentősen növeli az eredményként kapott XML méretét.
Ez a mechanizmus hasonló a .NET-keretrendszer újraegyesítés által használt bináris vagy SOAP szerializáláshoz (pontosabban az BinaryFormatter és a SoapFormatter).
NetDataContractSerializer
A használata hasonló a DataContractSerializer
használatához, a következő különbségekkel:
A konstruktorok nem követelik meg, hogy gyökértípust adjon meg. Bármilyen típust szerializálhat ugyanazzal a példánnyal
NetDataContractSerializer
.A konstruktorok nem fogadják el az ismert típusok listáját. Az ismert típusok mechanizmusa szükségtelen, ha a típusnevek szerializálva vannak az XML-ben.
A konstruktorok nem fogadnak el helyettesítő adatszerződést. Ehelyett elfogadnak egy ISurrogateSelector úgynevezett
surrogateSelector
paramétert (amely leképezi a SurrogateSelector tulajdonságot). Ez egy régi helyettesítő mechanizmus.A konstruktorok elfogadják a FormatterAssemblyStyle tulajdonsághoz AssemblyFormat leképező paramétert
assemblyFormat
. Ahogy korábban már említettem, ez a szerializáló verziószámozási képességeinek javítására használható. Ez megegyezik a bináris vagy SOAP FormatterAssemblyStyle szerializálási mechanizmussal.A konstruktorok elfogadják a StreamingContext tulajdonsághoz Context leképező paramétert
context
. Ezzel adatokat továbbíthat szerializált típusokba. Ez a használat megegyezik a StreamingContext más System.Runtime.Serialization osztályokban használt mechanizmus használatával.A Serialize metódusok és Deserialize a WriteObjectReadObject metódusok aliasai. Ezek azért léteznek, hogy konzisztensebb programozási modellt biztosítsanak bináris vagy SOAP szerializálással.
További információ ezekről a funkciókról: Bináris szerializálás.
Azok az XML-formátumok, amelyek használata NetDataContractSerializer
DataContractSerializer
általában nem kompatibilis. Ez azt jelzi, hogy az egyik szerializálóval való szerializálás és a másikkal való deszerializálás nem támogatott forgatókönyv.
Azt is vegye figyelembe, hogy az NetDataContractSerializer
objektumgráfban nem adja ki a teljes .NET-keretrendszer típust és szerelvénynevet az egyes csomópontokhoz. Ezt az információt csak akkor adja ki, ha az nem egyértelmű. Ez azt jelzi, hogy a kimenet a gyökérobjektum szintjén és bármilyen polimorfikus esetben jelenik meg.