serializace XML

Serializace je proces převodu objektu do formuláře, který lze snadno přenést. Například může serializovat objekt a přenosu je prostřednictvím Internetu pomocí protokolu HTTP mezi klientem a serverem. Na druhém konci rekonstruuje deserializace objektu z datového proudu.

Serializace XML serializuje pouze veřejné pole a hodnoty vlastností objektu do datový proud XML. Serializace XML neobsahuje informace o typu. Například pokud máte objekt knihy , který existuje v oboru názvů Library , není nijak zaručeno, že je deserializován do objektu stejného typu.

Poznámka

Serializace XML nepřevádět metody, indexery, soukromé pole nebo vlastnosti jen pro čtení (s výjimkou kolekce jen pro čtení). K serializaci všechny objektu polí a vlastností, veřejné a soukromé, použijte DataContractSerializer namísto serializace XML.

Centrální třída v serializaci XML je XmlSerializer Třída a nejdůležitější metody v této třídě jsou metody serializace a deserializace . XmlSerializer Vytváří soubory jazyka C# a jejich kompiluje do soubory DLL a provést serializace. XML Serializer Generator Tool (Sgen.exe) je navržena tak, aby byla tato serializace sestavení předem vygenerována s vaší aplikací a vylepšit výkon při spuštění. Datový proud XML generovaný objektem XmlSerializer je kompatibilní s doporučením konsorcium World Wide Web (W3C) XML Schema Definition Language (XSD) 1,0. Kromě toho jsou typy dat, které jsou generovány kompatibilní s dokumentu s názvem "část schématu XML 2: datové typy."

Data v objektech jsou popsána pomocí konstrukcí programovacích jazyků, jako jsou třídy, pole, vlastnosti, primitivní typy, pole a dokonce i vložené XML ve formě objektů XmlElement nebo XmlAttribute . Máte možnost vytvořit vlastní třídy označena s atributy, nebo pomocí nástroje definici schématu XML vygenerovat třídy založen na stávajícím schématu XML.

Pokud máte schématu XML, můžete spustit nástroj definici schématu XML k vytvoření sadu tříd, které jsou silného typu schématu a označena s atributy. Pokud instance této třídy serializován, generovaný XML dodržuje schématu XML. Za předpokladu tříd se můžete programovat proti snadno s ní manipulováno objektový model při zachování zajištěno, že generovaného kódu XML odpovídá schématu XML. Jedná se o alternativu k použití jiných tříd v rozhraní .NET, jako jsou třídy XmlReader a XmlWriter , pro analýzu a zápis datového proudu XML. Další informace najdete v tématu dokumenty a data XML. Tyto třídy umožňují analyzovat jakékoli datový proud XML. Naproti tomu objekt XmlSerializer použijte v případě, že se očekává, že datový proud XML odpovídá známému schématu XML.

Atributy řídí datový proud XML generovaný třídou XmlSerializer , což umožňuje nastavit obor názvů XML, název elementu, název atributu a tak dále pro datový proud XML. Další informace o těchto atributech a o tom, jak řídí serializace XML, naleznete v tématu řízení serializace XML pomocí atributů. Tabulka pro tyto atributy, které se používají k řízení vygenerovaného kódu XML, naleznete v tématu atributy, které řídí serializaci XML.

Třída XmlSerializer může dále serializovat objekt a generovat kódovaný datový proud SOAP XML. Vygenerovaný XML dodržuje část 5 W3c dokumentu s názvem "Simple Object Access Protocol (SOAP) 1.1." Další informace o tomto procesu naleznete v tématu How to: serializovat objekt jako datový proud XML SOAP-Encoded. Tabulku atributů, které řídí generovaný kód XML, naleznete v tématu atributy, které řídí serializaci kódovaných SOAP.

Třída XmlSerializer generuje zprávy protokolu SOAP, které vytvořil a předal webové služby XML. Chcete-li řídit zprávy protokolu SOAP, můžete použít atributy do třídy, vrácené hodnoty, parametry a pole nalezen v souboru XML webové služby (.asmx). Můžete použít atributy uvedené v "Atributy, aby ovládací prvek XML serializace" a "Atributy, aby ovládací prvek kódovaný SOAP serializace", protože webové služby XML lze použít buď literál nebo kódovaného protokolu SOAP stylu. Další informace o použití atributů k řízení XML generovaných webovou službou XML naleznete v tématu serializace XML s webovými službami XML. Další informace o webových službách SOAP a XML najdete v tématu Přizpůsobení formátování zpráv SOAP.

Důležité informace o zabezpečení pro XmlSerializer aplikace

Při vytváření aplikace, která používá XmlSerializer, pamatujte na následující položky a jejich důsledky:

  • XmlSerializer vytvoří soubory C# (. cs) a zkompiluje je do souborů .dll v adresáři s názvem proměnná prostředí TEMP; s těmito knihovnami DLL dochází k serializaci.

    Poznámka

    Tyto sestavení serializace můžete předem vygenerovaných a podepsán pomocí nástroje SGen.exe. Tato činnost na serveru webových služeb nefunguje. Jinými slovy je pouze pro použití klienta a pro ruční serializaci.

    Kód a knihoven DLL, která jsou citlivé na škodlivý proces v době vytvoření a sestavení. Je možné, že dva nebo více uživatelů bude sdílet dočasný adresář. Sdílení DOČASNÉho adresáře je nebezpečné, pokud tyto dva účty mají odlišná oprávnění zabezpečení a účet s vyšším oprávněním spouští aplikaci pomocí objektu XmlSerializer. V takovém případě může jeden uživatel porušení zabezpečení počítače tím, že nahradí soubor. cs nebo .dll, který je zkompilován. Chcete-li tento problém odstranit, vždy ujistěte se, že každý účet v počítači má vlastní profil. Ve výchozím nastavení proměnná prostředí TEMP odkazuje na jiný adresář pro každý účet.

  • Pokud uživatel se zlými úmysly pošle souvislý proud dat XML na webový server (útok na útok DoS), pak objekt XmlSerializer pokračuje ve zpracování dat, dokud počítač nedosáhne nedostatku prostředků.

    Tento druh útoku se eliminují, pokud používáte počítač se systémem Internet Information Services (IIS) a je aplikace spuštěna v rámci služby IIS. Služba IIS obsahuje jako brána, který nezpracovává datových proudů delší než nastavené množství (výchozí hodnota je 4 KB). Pokud vytvoříte aplikaci, která nepoužívá službu IIS a deserializace s objektem XmlSerializer, měli byste implementovat podobnou bránu, která znemožňuje útok na útok DoS (Denial of Service).

  • XmlSerializer serializace dat a spustí libovolný kód pomocí libovolného typu, který je mu předán.

    V které škodlivý objekt představuje hrozbu dvěma způsoby. Mohl by spustit škodlivý kód nebo může vložit škodlivý kód do souboru jazyka C# vytvořeného objektem XmlSerializer. V druhém případě existuje teoretická možnost, že škodlivý objekt může nějakým způsobem vkládat kód do souboru jazyka C# vytvořeného objektem XmlSerializer. I když má prověřit tento problém, důkladně a takového útoku je považován za pravděpodobné, byste měli vzít preventivní opatření nikdy serializace dat s typem neznámý a nedůvěryhodný.

  • Serializovaná citlivá data může být ohrožena.

    Poté, co objekt XmlSerializer obsahuje Serializovaná data, může být uložen jako soubor XML nebo jiné úložiště dat. Pokud vaše úložiště dat je k dispozici pro procesy nebo je zobrazen v intranetu nebo Internetu, můžete data odcizení a záměrně použity. Například pokud vytvoříte aplikaci, která serializuje objednávky obsahující čísla kreditních karet, je velmi důvěrná data. K tomu nedocházelo, vždy chránit úložiště dat a proveďte kroky, které chcete zachovat privátní.

Serializace jednoduchou třídu

Následující příklad kódu ukazuje základní třídu s polem veřejné.

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

Pokud je serializována instance této třídy, může vypadat takto.

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

Další příklady serializace naleznete v tématu Příklady serializace XML.

Položky, které lze serializovat

Následující položky lze serializovat pomocí třídy XmlSerializer :

  • Vlastnosti veřejné čtení a zápis a pole veřejné třídy.

  • Třídy, které implementují rozhraní ICollection nebo IEnumerable

    Poznámka

    Pouze kolekce jsou serializovaná, není veřejné vlastnosti.

  • Objekty XmlElement .

  • Objekty XmlNode .

  • Objekty DataSet .

Další informace o serializaci nebo deserializaci objektů naleznete v tématu How to: serializovat objekt a How to: rekonstruovat Object.

Výhody použití serializace XML

Třída XmlSerializer poskytuje kompletní a flexibilní řízení při serializaci objektu jako XML. Pokud vytváříte webové služby XML, můžete použít atributy, které řídí serializace za účelem třídy a členy zajistit, že výstup kódu XML odpovídá určité schéma.

Například XmlSerializer umožňuje:

  • Zadejte, zda pole nebo vlastnost by měla být zakódován jako atribut nebo element.

  • Zadejte obor názvů XML používat.

  • Zadejte název elementu nebo atributu, pokud je název pole nebo vlastnost nevhodný.

Další výhodou serializace XML je, zda máte bez omezení na aplikací, které vytvoříte, jako datový proud XML, který je generován odpovídá dané schéma. Představte si schématu, který slouží k popisu knihy. Nabízí nadpis, Autor, vydavatel a ISBN čísla elementu. Můžete vyvíjet aplikace, která zpracovává data XML v jakékoli požadovaným způsobem, například jako pořadí adresáře nebo jako inventáře knihy. V obou případech jediným požadavkem je, že datový proud XML odpovídá zadané schéma jazyka (XSD) definice schématu XML.

Důležité informace o serializaci XML

Při použití třídy XmlSerializer je třeba zvážit následující:

  • Nástroj Sgen.exe je výslovně určena ke generování sestavení serializace pro optimální výkon.

  • Serializovaná data obsahuje vlastní data a strukturu vaší třídy. Informace o typu identitu a sestavení nejsou zahrnuty.

  • Pouze veřejné vlastnosti a pole lze serializovat. Vlastnosti musí mít veřejnou přistupující objekty (get a set metod). Pokud musí serializovat neveřejným dat, použijte DataContractSerializer třídy a serializace XML.

  • Třída musí mít konstruktor bez parametrů, aby ji bylo možné serializovat pomocí XmlSerializer.

  • Metody nelze serializovat.

  • XmlSerializer může zpracovat třídy, které implementují rozhraní IEnumerable nebo ICollection odlišně, pokud splňují určité požadavky, následovně.

    Třída, která implementuje IEnumerable, musí implementovat veřejnou metodu Add, která přebírá jeden parametr. Parametr metody Add musí být konzistentní (polymorfní) s typem vrácený z vlastnosti IEnumerator.Current vrácené metodou GetEnumerator.

    Třída, která kromě IEnumerable (například CollectionBase) implementuje ICollection, musí mít veřejnou vlastnost Indexed Item (indexer v jazyce C#), která přebírá celé číslo a musí mít veřejnou vlastnost Count typu integer. Parametr předaný metodě Add musí být stejný typ jako parametr vrácený z vlastnosti Item nebo jednoho ze základů tohoto typu.

    Pro třídy, které implementují ICollection, se hodnoty, které se mají serializovat, načítá z indexované vlastnosti Item místo voláním metody GetEnumerator. Veřejná pole a vlastnosti navíc nejsou serializovány, s výjimkou veřejných polí, která vrací jinou třídu kolekce (ta, která implementuje ICollection). Příklad najdete v tématu Příklady serializace XML.

Mapování typů dat XSD

Dokument W3C s názvem Schéma XML – část 2: Datové typy určuje jednoduché datové typy, které jsou povolené ve schématu jazyka XSD (Schema Definition Language) XML. U mnoha z nich (například int a decimal) existuje odpovídající datový typ v .NET. Některé datové typy XML však nemají odpovídající datový typ .NET, například datový typ NMTOKEN. Pokud v takových případech použijete nástroj definice schématu XML ( nástroj pro definici schématu XML (Xsd.exe)) ke generování tříd ze schématu, je na člen řetězce typu použit odpovídající atribut a jeho vlastnost DataType je nastavena na název datového typu XML. Například pokud schéma obsahuje element s názvem "MyToken" s datovým typem XML NMTOKEN, vygenerovaná třída může obsahovat člena, jak je znázorněno v následujícím příkladu.

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

Podobně platí, že pokud vytváříte třídu, která musí odpovídat určitému schématu XML (XSD), měli byste použít příslušný atribut a nastavit jeho vlastnost DataType na požadovaný název datového typu XML.

Úplný seznam mapování typů najdete ve vlastnosti DataType pro libovolnou z následujících tříd atributů:

Viz také