Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.
Az XML-szerializálás az objektum nyilvános tulajdonságainak és mezőinek soros formátumba (ebben az esetben XML) történő konvertálása tárolás vagy átvitel céljából. A deszerializálás újra létrehozza az objektumot az eredeti állapotában az XML-kimenetből. A szerializálás az objektumok állapotának streambe vagy pufferbe való mentésének módjaként is felfogható. Például ASP.NET az osztály használatával kódolja az XmlSerializer XML webszolgáltatás-üzeneteket.
Az objektumok adatainak leírása programozási nyelv szerkezetekkel történik, például osztályok, mezők, tulajdonságok, primitív típusok, tömbök és akár beágyazott XML-fájlok formájában vagy XmlElement objektumok formájábanXmlAttribute. Lehetősége van saját osztályokat létrehozni, attribútumokkal jegyzetekkel ellátni, vagy az XML sémadefiníciós eszközzel (Xsd.exe) létrehozni az osztályokat egy meglévő XML-sémadefiníciós (XSD) dokumentum alapján. Ha XML-sémával rendelkezik, a Xsd.exe futtatásával egy osztálykészletet hozhat létre, amely erősen típusosan a sémához kötődnek, és attribútumokkal vannak ellátva, hogy a sémához igazodjanak a szerializálás során.
Az adatok objektumok és XML közötti átviteléhez a programozási nyelv szerkezetéből az XML-sémába, valamint az XML-sémából a programozási nyelvi szerkezetekbe való leképezésre van szükség. Az XmlSerializer olyan kapcsolódó eszközök, mint a Xsd.exe biztosítják a hidat a két technológia között mind a tervezési időben, mind a futtatókörnyezetben. Tervezéskor használja a Xsd.exe-t a saját osztályaiból egy XML séma dokumentum (.xsd) előállításához vagy osztályok előállításához egy adott sémából. Az osztályok mindkét esetben egyéni attribútumokkal vannak eljegyzve, hogy a rendszer útmutatást adjon az XmlSerializer XML-sémarendszer és a közös nyelvi futtatókörnyezet közötti megfeleltetésről. Futásidőben az osztályok példányai szerializálhatók az adott sémát követő XML-dokumentumokba. Hasonlóképpen, ezek az XML-dokumentumok futtatókörnyezeti objektumokká deszerializálhatók. Vegye figyelembe, hogy az XML-séma nem kötelező, és nem szükséges a tervezéskor vagy a futtatókörnyezetben.
A generált XML vezérlése
A létrehozott XML szabályozásához speciális attribútumokat alkalmazhat az osztályokra és a tagokra. Ha például egy másik XML-elemnevet szeretne megadni, alkalmazzon egy XmlElementAttribute nyilvános mezőt vagy tulajdonságot, és állítsa be a tulajdonságot ElementName . A hasonló attribútumok teljes listáját az XML-szerializálást vezérlő attribútumok című témakörben találja. Az XML-kimenet szabályozásához implementálhatja az IXmlSerializable interfészt is.
Ha a létrehozott XML-fájlnak meg kell felelnie a World Wide Consortium dokumentum 5. szakaszának, Simple Object Access Protocol (SOAP) 1.1, meg kell építenie a(z) XmlSerializer egy XmlTypeMapping-vel. A kódolt SOAP XML további szabályozásához használja a kódolt SOAP szerializálást vezérlő attribútumokban felsorolt attribútumokat.
Az XmlSerializer segítségével kihasználhatja az erősen típusozott osztályok előnyeit, miközben megőrzi az XML használatának rugalmasságát. Az erősen típusos osztályaiban a XmlElement, XmlAttribute vagy XmlNode típusú mezők vagy tulajdonságok használatával közvetlenül XML-objektumokba olvashatja be az XML-dokumentum részeit.
Ha bővíthető XML-sémákkal dolgozik, akkor az XmlAnyElementAttribute és XmlAnyAttributeAttribute attribútumokat is használhatja olyan elemek vagy attribútumok szerializálására és deszerializálására, amelyek nem találhatók az eredeti sémában. Az objektumok használatához alkalmazzon egy XmlAnyElementAttribute olyan mezőt, amely egy objektumtömböt XmlElement ad vissza, vagy alkalmazzon egy XmlAnyAttributeAttribute olyan mezőre, amely egy objektumtömböt XmlAttribute ad vissza.
Ha egy tulajdonság vagy mező összetett objektumot (például tömböt vagy osztálypéldányt) ad vissza, az XmlSerializer átalakítja azt a fő XML-dokumentumban beágyazott elemgé. Az alábbi kód első osztálya például a második osztály egy példányát adja vissza.
Public Class MyClass
Public MyObjectProperty As MyObject
End Class
Public Class MyObject
Public ObjectName As String
End Class
public class MyClass
{
public MyObject MyObjectProperty;
}
public class MyObject
{
public string ObjectName;
}
A szerializált, XML-kimenet így néz ki:
<MyClass>
<MyObjectProperty>
<ObjectName>My String</ObjectName>
</MyObjectProperty>
</MyClass>
Ha egy séma nem kötelező elemet tartalmaz (minOccurs = '0'), vagy ha a séma alapértelmezett értéket tartalmaz, két lehetőség közül választhat. Az egyik lehetőség az System.ComponentModel.DefaultValueAttribute alapértelmezett érték megadása az alábbi kódban látható módon.
Public Class PurchaseOrder
<System.ComponentModel.DefaultValueAttribute ("2002")> _
Public Year As String
End Class
public class PurchaseOrder
{
[System.ComponentModel.DefaultValueAttribute ("2002")]
public string Year;
}
Egy másik lehetőség, hogy egy speciális mintát használ a XmlSerializer által felismerhető logikai mező létrehozásához, és a XmlIgnoreAttribute alkalmazását a mezőre. A minta a következő formában propertyNameSpecifiedjön létre: . Ha például van egy "MyFirstName" nevű mező, akkor egy "MyFirstNameSpecified" nevű mezőt is létre kell hoznia, amely arra utasítja, XmlSerializer hogy létre kell-e hozni a "MyFirstName" nevű XML-elemet. Ez az alábbi példában látható.
Public Class OptionalOrder
' This field's value should not be serialized
' if it is uninitialized.
Public FirstOrder As String
' Use the XmlIgnoreAttribute to ignore the
' special field named "FirstOrderSpecified".
<System.Xml.Serialization.XmlIgnoreAttribute> _
Public FirstOrderSpecified As Boolean
End Class
public class OptionalOrder
{
// This field should not be serialized
// if it is uninitialized.
public string FirstOrder;
// Use the XmlIgnoreAttribute to ignore the
// special field named "FirstOrderSpecified".
[System.Xml.Serialization.XmlIgnoreAttribute]
public bool FirstOrderSpecified;
}
Az alapértelmezett szerializálás felülbírálása
Felülbírálhatja az objektumok és azok mezőinek és tulajdonságainak szerializálását is, ha létrehoz egy megfelelő attribútumot, és hozzáadja azt az XmlAttributes osztály egy példányához. A szerializálás felülírásának két felhasználási módja van: először is szabályozhatja és kiegészítheti a DLL-ben található objektumok szerializálását, még akkor is, ha nincs hozzáférése a forráshoz; másodszor létrehozhat egy sor szerializálható osztályt, de többféleképpen szerializálhatja az objektumokat. További részletekért lásd a XmlAttributeOverrides osztályt és a Hogyan: A származtatott osztályok szerializálásának szabályozása című részben.
Objektum szerializálásához hívja meg a metódust Serialize . Egy objektum deszerializálásához hívja meg a metódust Deserialize .
Ha XML-névtereket szeretne hozzáadni egy XML-dokumentumhoz, tekintse meg a következőt XmlSerializerNamespaces:
Megjegyzés:
A XmlSerializer különleges bánásmódban részesíti azokat az osztályokat, amelyek implementálják a IEnumerable vagy ICollection-t. A implementálandó osztálynak IEnumerable olyan nyilvános Add metódust kell implementálnia, amely egyetlen paramétert használ. A Add metódus paraméterének ugyanolyan típusúnak kell lennie, mint amit a Current tulajdonság ad vissza a GetEnumerator által visszaadott értéken, vagy annak a típusnak az alapjainak egyikéről. Egy osztálynak, amely megvalósítja a ICollection-t és a CollectionBase-t (mint például a IEnumerable), rendelkeznie kell egy nyilvános Item indexelt tulajdonsággal (C#-ban indexelővel), amely egy egész számot vesz igénybe, és rendelkeznie kell egy nyilvános egész típusú Count tulajdonsággal. A metódus paraméterének Add meg kell egyeznie a tulajdonságból Item visszaadott típussal, vagy az adott típus alapjainak egyikével. A implementálandó ICollectionosztályok esetében a szerializálandó értékek az indexelt Item tulajdonságból lesznek lekérve, nem meghívással GetEnumerator.
Az objektum deszerializálásához engedéllyel kell rendelkeznie ahhoz, hogy az ideiglenes könyvtárba (a TEMP környezeti változó által meghatározott módon) írjon.
Dinamikusan létrehozott szerelvények
A teljesítmény növelése érdekében az XML szerializálási infrastruktúra dinamikusan generál szerelvényeket a megadott típusok szerializálásához és deszerializálásához. Az infrastruktúra megkeresi és újra felhasználja ezeket az összeállításokat. Ez a viselkedés csak a következő konstruktorok használatakor fordul elő:
XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
Ha a többi konstruktort használja, ugyanannak a szerelvénynek több verziója is létrejön, és soha nem lesz eltávolítva, ami memóriavesztést és gyenge teljesítményt eredményez. A legegyszerűbb megoldás a korábban említett két konstruktor egyikének használata. Ellenkező esetben az alábbi példában bemutatott módon cache-elnie kell a szerelvényeket egy Hashtable.
Hashtable serializers = new Hashtable();
// Use the constructor that takes a type and XmlRootAttribute.
XmlSerializer s = new XmlSerializer(typeof(MyClass), myRoot);
// Implement a method named GenerateKey that creates unique keys
// for each instance of the XmlSerializer. The code should take
// into account all parameters passed to the XmlSerializer
// constructor.
object key = GenerateKey(typeof(MyClass), myRoot);
// Check the local cache for a matching serializer.
XmlSerializer ser = (XmlSerializer)serializers[key];
if (ser == null)
{
ser = new XmlSerializer(typeof(MyClass), myRoot);
// Cache the serializer.
serializers[key] = ser;
}
// Use the serializer to serialize or deserialize.
Dim serializers As New Hashtable()
' Use the constructor that takes a type and XmlRootAttribute.
Dim s As New XmlSerializer(GetType([MyClass]), myRoot)
' Implement a method named GenerateKey that creates unique keys
' for each instance of the XmlSerializer. The code should take
' into account all parameters passed to the XmlSerializer
' constructor.
Dim key As Object = GenerateKey(GetType([MyClass]), myRoot)
' Check the local cache for a matching serializer.
Dim ser As XmlSerializer = CType(serializers(key), XmlSerializer)
If ser Is Nothing Then
ser = New XmlSerializer(GetType([MyClass]), myRoot)
' Cache the serializer.
serializers(key) = ser
End If
' Use the serializer to serialize or deserialize.
Tömblista és általános lista szerializálása
A következő elemek nem szerializálhatók vagy deszerializálhatók: XmlSerializer
Előjel nélküli Long típusú enumerációk szerializálása
A XmlSerializer nem példányosítható sorosításhoz, ha a következő feltételek teljesülnek: Az enumeráció nem előjeles hosszú egész típusú (ulong a C#-ban), és az enumeráció tartalmaz olyan tagot, amelynek értéke meghaladja a 9 223 372 036 854 775 807-et. Az alábbiak például nem szerializálhatók.
public enum LargeNumbers: ulong
{
a = 9223372036854775808
}
// At runtime, the following code will fail.
xmlSerializer mySerializer=new XmlSerializer(typeof(LargeNumbers));
Elavult típusok
Az XmlSerializer osztály nem szerializálja a megjelölt [Obsolete]objektumokat.