Megosztás a következőn keresztül:


XML-szerializálás

A szerializálás egy objektum könnyen szállítható űrlapmá alakításának folyamata. Szerializálhat például egy objektumot, és az interneten keresztül, HTTP használatával is szállíthatja egy ügyfél és egy kiszolgáló között. A másik végén a deszerializálás rekonstruálja az objektumot a streamből.

Az XML-szerializálás csak az objektumok nyilvános mezőit és tulajdonságértékeit szerializálja XML-adatfolyamba. Az XML-szerializálás nem tartalmaz típusadatokat. Ha például van egy Könyv objektuma, amely az Erőforrástár névterében található, nincs garancia arra, hogy deszerializálva van egy azonos típusú objektumba.

Feljegyzés

Az XML-szerializálás nem konvertál metódusokat, indexelőket, privát mezőket vagy írásvédett tulajdonságokat (kivéve az írásvédett gyűjteményeket). Egy objektum összes mezőjének és tulajdonságának szerializálásához használja az XML-szerializálás helyett a nyilvános és a DataContractSerializer privát objektumot.

Az XML-szerializálás központi osztálya az XmlSerializer osztály, és ebben az osztályban a legfontosabb metódusok a Szerializálás és a Deszerializálás metódusok. A XmlSerializer program C#-fájlokat hoz létre, és lefordítja őket .dll fájlokba a szerializálás végrehajtásához. Az XML szerializáló generátor eszköz (Sgen.exe) úgy lett kialakítva, hogy ezeket a szerializálási szerelvényeket előre létrehozza, hogy az alkalmazással együtt üzembe helyezhető legyen, és javítja az indítási teljesítményt. Az XmlSerializer által létrehozott XML-adatfolyam megfelel a World Wide Web Consortium (W3C) XML Schema Definition Language (XSD) 1.0 javaslatának. Ezenkívül a létrehozott adattípusok megfelelnek az "XML-séma 2. rész: Adattípusok" című dokumentumnak.

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őt xmlElement vagy XmlAttribute objektumok formájában beágyazott XML-fájlokkal. Létrehozhatja saját osztályait attribútumokkal jegyzetekkel, vagy az XML-sémadefiníciós eszközzel létrehozhatja az osztályokat egy meglévő XML-séma alapján.

Ha XML-sémával rendelkezik, futtathatja az XML-sémadefiníciós eszközt a sémába erősen beírt és attribútumokkal jegyzetelt osztályok készletének létrehozásához. Ha egy ilyen osztály egy példánya szerializálva van, a létrehozott XML megfelel az XML-sémának. Az ilyen osztályokkal együtt egy könnyen manipulálható objektummodellen programezhet, miközben meggyőződhet arról, hogy a létrehozott XML megfelel az XML-sémának. Ez alternatíva arra, hogy más osztályokat használ a .NET-ben, például az XmlReader és az XmlWriter osztályt egy XML-stream elemzéséhez és írásához. További információ: XML-dokumentumok és adatok. Ezek az osztályok lehetővé teszik bármely XML-adatfolyam elemzését. Ezzel szemben használja az XmlSerializert , ha az XML-adatfolyam várhatóan megfelel egy ismert XML-sémának.

Az attribútumok szabályozzák az XmlSerializer osztály által létrehozott XML-adatfolyamot, így beállíthatja az XML-adatfolyam XML-névterét, elemnevét, attribútumnevét stb. További információ ezekről az attribútumokról és az XML-szerializálás szabályozásáról: XML-szerializálás szabályozása attribútumokkal. A létrehozott XML szabályozásához használt attribútumok táblázatát az XML-szerializálást vezérlő attribútumok című témakörben találhatja meg.

Az XmlSerializer osztály tovább szerializálhat egy objektumot, és létrehozhat egy kódolt SOAP XML-adatfolyamot. A létrehozott XML megfelel a "Simple Object Access Protocol (SOAP) 1.1" című World Wide Web Consortium-dokumentum 5. szakaszának. További információ erről a folyamatról : Objektum szerializálása SOAP kódolású XML-adatfolyamként. A létrehozott XML-t vezérlő attribútumok táblázatát a kódolt SOAP-szerializálást vezérlő attribútumok című témakörben találhatja meg.

Az XmlSerializer osztály létrehozza az XML-webszolgáltatások által létrehozott és továbbított SOAP-üzeneteket. A SOAP-üzenetek szabályozásához attribútumokat alkalmazhat az osztályokra, visszaadhatja az XML Web Service-fájlban (.asmx) található értékeket, paramétereket és mezőket. Az "XML-szerializálást vezérlő attribútumok" és a "Kódolt SOAP szerializálást vezérlő attribútumok" területen felsorolt attribútumokat is használhatja, mivel az XML-webszolgáltatások használhatják a literál vagy a kódolt SOAP stílust. További információ az XML-webszolgáltatás által létrehozott XML szabályozásához használt attribútumokról: XML-szerializálás XML Web Services szolgáltatással. A SOAP- és XML-webszolgáltatásokról további információt a SOAP-üzenetformázás testreszabása című témakörben talál.

Az XmlSerializer-alkalmazások biztonsági szempontjai

Az XmlSerializert használó alkalmazások létrehozásakor vegye figyelembe az alábbi elemeket és azok következményeit:

  • Az XmlSerializer C# (.cs) fájlokat hoz létre, és .dll fájlokba fordítja őket a TEMP környezeti változó által elnevezett könyvtárban; a szerializálás ezekkel a DLL-ekkel történik.

    Feljegyzés

    Ezek a szerializálási szerelvények előre létrehozhatók és aláírhatók a SGen.exe eszközzel. Ez nem működik webszolgáltatások kiszolgálóján. Más szóval csak ügyfél-használatra és manuális szerializálásra.

    A kód és a DLL-ek sebezhetők egy rosszindulatú folyamatnak a létrehozás és fordítás idején. Előfordulhat, hogy két vagy több felhasználó is megosztja a TEMP-címtárat. A TEMP-címtár megosztása akkor veszélyes, ha a két fiók különböző biztonsági jogosultságokkal rendelkezik, és a magasabb jogosultságú fiók egy alkalmazást futtat az XmlSerializer használatával. Ebben az esetben egy felhasználó megsértheti a számítógép biztonságát a lefordított .cs vagy .dll fájl lecserélésével. A probléma kiküszöbölése érdekében mindig győződjön meg arról, hogy a számítógép minden fiókja saját profillal rendelkezik. Alapértelmezés szerint a TEMP környezeti változó egy másik könyvtárra mutat minden fiókhoz.

  • Ha egy rosszindulatú felhasználó folyamatos XML-adatfolyamot küld egy webkiszolgálónak (szolgáltatásmegtagadási támadás), akkor az XmlSerializer addig dolgozza fel az adatokat, amíg a számítógép nem fut kevés erőforrással.

    Ez a fajta támadás megszűnik, ha Internet Information Servicest (IIS) futtató számítógépet használ, és az alkalmazás az IIS-ben fut. Az IIS tartalmaz egy kaput, amely nem dolgoz fel streameket a megadott mennyiségnél hosszabb ideig (az alapértelmezett érték 4 KB). Ha olyan alkalmazást hoz létre, amely nem használ IIS-t, és deszerializálja az XmlSerializert, egy hasonló kaput kell implementálnia, amely megakadályozza a szolgáltatásmegtagadásos támadást.

  • Az XmlSerializer szerializálja az adatokat, és bármilyen kódot futtat a megadott típussal.

    A rosszindulatú objektumok kétféleképpen jelenthetnek fenyegetést. Rosszindulatú kódot futtathat, vagy kártékony kódot szúrhat be az XmlSerializer által létrehozott C# fájlba. A második esetben elméletileg lehetséges, hogy egy rosszindulatú objektum valamilyen módon kódot fecskendezhet az XmlSerializer által létrehozott C#-fájlba. Bár ezt a problémát alaposan megvizsgálták, és egy ilyen támadás nem tekinthető valószínűtlennek, meg kell tenni az elővigyázatosságot, hogy soha ne szerializáljon ismeretlen és nem megbízható típusú adatokat.

  • A szerializált bizalmas adatok sebezhetők lehetnek.

    Miután az XmlSerializer szerializált adatokat adott meg, xml-fájlként vagy más adattárként is tárolható. Ha az adattár más folyamatok számára is elérhető, vagy intraneten vagy interneten látható, az adatok ellophatók és rosszindulatúan felhasználhatók. Ha például olyan alkalmazást hoz létre, amely hitelkártyaszámokat tartalmazó rendeléseket szerializál, az adatok nagyon érzékenyek. Ennek megakadályozása érdekében mindig védje az adattárat az adatai számára, és tegye meg a szükséges lépéseket a személyes adatok tárolásához.

Egyszerű osztály szerializálása

Az alábbi példakód egy nyilvános mezővel rendelkező alapszintű osztályt mutat be.

Public Class OrderForm
    Public OrderDate As DateTime
End Class
public class OrderForm
{
    public DateTime OrderDate;
}

Az osztály egy példányának szerializálása az alábbihoz hasonló lehet.

<OrderForm>
    <OrderDate>12/12/01</OrderDate>
</OrderForm>

A szerializálásra további példákat az XML-szerializálás példái című témakörben talál.

Szerializálható elemek

A következő elemek szerializálhatók az XmlSerializer osztály használatával:

  • Nyilvános olvasási/írási tulajdonságok és a nyilvános osztályok mezői.

  • Az ICollectiont vagy az IEnumerable-t implementáló osztályok.

    Feljegyzés

    Csak a gyűjtemények szerializáltak, nem nyilvános tulajdonságok.

  • XmlElement-objektumok .

  • XmlNode-objektumok .

  • DataSet-objektumok .

Az objektumok szerializálásával vagy deszerializálásával kapcsolatos további információkért tekintse meg az Objektumok szerializálása és az Objektumok deszerializálása című témakört.

Az XML-szerializálás használatának előnyei

Az XmlSerializer osztály teljes és rugalmas vezérlést biztosít, amikor XML-ként szerializál egy objektumot. HA XML-webszolgáltatást hoz létre, a szerializálást vezérlő attribútumokat alkalmazhat az osztályokra és tagokra annak biztosítása érdekében, hogy az XML-kimenet megfeleljen egy adott sémának.

Az XmlSerializer például a következőket teszi lehetővé:

  • Megadhatja, hogy egy mezőt vagy tulajdonságot attribútumként vagy elemként kell-e kódolni.

  • Adjon meg egy használandó XML-névteret.

  • Adja meg egy elem vagy attribútum nevét, ha egy mező vagy tulajdonság neve nem megfelelő.

Az XML-szerializálás másik előnye, hogy nincsenek korlátozások a fejlesztendő alkalmazásokra, amíg a létrehozott XML-adatfolyam megfelel egy adott sémának. Képzeljen el egy sémát, amely a könyvek leírására szolgál. A cím, a szerző, a közzétevő és az ISBN-szám elemet tartalmazza. Olyan alkalmazást fejleszthet, amely bármilyen módon feldolgozza az XML-adatokat, például könyvrendelésként vagy könyvleltárként. Mindkét esetben az egyetlen követelmény, hogy az XML-adatfolyam megfeleljen a megadott XML-sémadefiníciós (XSD) sémának.

XML-szerializálási szempontok

Az XmlSerializer osztály használatakor a következőket kell figyelembe venni:

  • A Sgen.exe eszköz kifejezetten szerializálási szerelvények létrehozására lett kialakítva az optimális teljesítmény érdekében.

  • A szerializált adatok csak magát az adatokat és az osztályok struktúráját tartalmazzák. A típusidentitás és a szerelvény adatai nem szerepelnek a fájlban.

  • Csak nyilvános tulajdonságok és mezők szerializálhatók. A tulajdonságoknak nyilvános tartozékokkal kell rendelkezniük (lekérési és beállítási módszerekkel). Ha nem nyilvános adatokat kell szerializálnia, használja az osztályt XML-szerializálás DataContractSerializer helyett.

  • Az osztálynak paraméter nélküli konstruktorsal kell rendelkeznie, amelyet az XmlSerializer szerializál.

  • A metódusok nem szerializálhatók.

  • Az XmlSerializer az IEnumerable-t vagy az ICollection-et eltérően implementáló osztályokat is feldolgozhat, ha megfelelnek bizonyos követelményeknek, az alábbiak szerint.

    Az IEnumerable-t implementáló osztálynak egy nyilvános Add metódust kell implementálnia, amely egyetlen paramétert vesz igénybe. Az Add metódus paraméterének konzisztensnek (polimorfikusnak) kell lennie az IEnumerator.Current tulajdonság által a GetEnumerator metódusból visszaadott típussal.

    Az ICollectiont az IEnumerable (például CollectionBase) mellett implementáló osztálynak rendelkeznie kell egy nyilvános elem indexelt tulajdonságával (a C#-ban egy indexelővel), amely egész számot vesz igénybe, és egy egész típusú nyilvános Count tulajdonságdal kell rendelkeznie. Az Add metódusnak átadott paraméternek meg kell egyeznie az Item tulajdonságból visszaadott típussal, vagy az adott típus alapjainak egyikével.

    Az ICollectiont implementáló osztályok esetében a szerializálandó értékek a GetEnumerator meghívása helyett az indexelt Elem tulajdonságból lesznek lekérve. A nyilvános mezők és tulajdonságok nem szerializálva vannak, kivéve azokat a nyilvános mezőket, amelyek egy másik gyűjteményosztályt adnak vissza (az ICollection-et implementálva). Példaként lásd az XML-szerializálás példáit.

XSD-adattípus-leképezés

Az XML-séma 2. része: Az adattípusok az XML-sémadefiníciós (XSD) sémában engedélyezett egyszerű adattípusokat határozzák meg. Sok ilyen (például int és decimális) esetében van egy megfelelő adattípus a .NET-ben. Egyes XML-adattípusok azonban nem rendelkeznek megfelelő .NET-adattípussal, például az NMTOKEN adattípussal. Ilyen esetekben, ha az XML-sémadefiníciós eszközt (XML-sémadefiníciós eszköz (Xsd.exe)) használja osztályok létrehozásához egy sémából, a rendszer egy megfelelő attribútumot alkalmaz a típussztring egy tagjára, a DataType tulajdonság pedig az XML-adattípus nevére van állítva. Ha például egy séma tartalmaz egy "MyToken" nevű elemet az NMTOKEN XML-adattípussal, a létrehozott osztály tartalmazhat egy tagot az alábbi példában látható módon.

<XmlElement(DataType:="NMTOKEN")> _
Public MyToken As String
[XmlElement(DataType = "NMTOKEN")]
public string MyToken;

Hasonlóképpen, ha olyan osztályt hoz létre, amelynek meg kell felelnie egy adott XML-sémának (XSD), a megfelelő attribútumot kell alkalmaznia, és a DataType tulajdonságát a kívánt XML-adattípusnévre kell állítania.

A típusleképezések teljes listáját az alábbi attribútumosztályok DataType tulajdonságában találja:

Lásd még