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. Pokud máte například objekt Knihy , který existuje v oboru názvů Knihovny , neexistuje žádná záruka, ž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 Serialize a Deserialize metody. XmlSerializer Vytváří soubory jazyka C# a jejich kompiluje do soubory DLL a provést serializace. Nástroj generátoru serializátoru XML (Sgen.exe) je navržen tak, aby vygeneroval tato sestavení serializace předem, aby byla nasazena s vaší aplikací a zlepšila výkon při spuštění. Datový proud XML vygenerovaný XmlSerializer je kompatibilní s doporučením XSD (World Wide Web Consortium) 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í konstruktorů programovacího jazyka, jako jsou třídy, pole, vlastnosti, primitivní typy, pole a dokonce vložený XML ve formě XmlElement nebo XmlAttribute objekty. 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. Toto je alternativa k použití jiných tříd v .NET, jako jsou XmlReader a XmlWriter třídy, parsovat a zapisovat XML stream. Další informace naleznete v tématu Dokumenty a data XML. Tyto třídy umožňují analyzovat jakékoli datový proud XML. Naproti tomu použijte XmlSerializer , pokud se očekává, že datový proud XML odpovídá známému schématu XML.

Atributy řídí datový proud XML vygenerovaný XmlSerializer třídy, což umožňuje nastavit xml obor názvů, název elementu, název atributu atd. stream XML. Další informace o těchto atributech a o tom, jak řídí serializace XML, naleznete v tématu Řízení serializace XML pomocí atributů. Tabulka těchto atributů, které se používají k řízení vygenerovaného XML, naleznete v části Atributy, které řídí serializaci XML.

XmlSerializer třída může dále serializovat objekt a generovat kódovaný SOAP XML stream. Vygenerovaný kód XML dodržuje část 5 dokumentu konsorcia World Wide Web Consortium s názvem "Simple Object Access Protocol (SOAP) 1.1" Další informace o tomto procesu naleznete v tématu Postupy: Serializace objektu jako SOAP kódovaný XML Stream. Tabulka atributů, které řídí vygenerovaný XML, naleznete v části Atributy, které řídí kódované SERIALizace SOAP.

Třída XmlSerializer generuje zprávy SOAP vytvořené a předány do webových služeb 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 vygenerované webovou službou XML naleznete v tématu Serializace XML s XML Web Services. Další informace o webových službách SOAP a XML naleznete 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, mějte na paměti následující položky a jejich důsledky:

  • XmlSerializer vytvoří soubory C# (.cs) a zkompiluje je do .dll souborů v adresáři pojmenovaném proměnnou prostředí TEMP; serializace se vyskytuje s těmito knihovny DLL.

    Poznámka:

    Tyto sestavení serializace můžete předem vygenerovaných a podepsán pomocí nástroje SGen.exe. To nefunguje na serveru webových služeb. 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í. Může být možné, aby dva nebo více uživatelů sdíleli adresář TEMP. Sdílení adresáře TEMP je nebezpečné, pokud mají oba účty různá oprávnění zabezpečení a účet s vyššími oprávněními spouští aplikaci pomocí XmlSerializer. V takovém případě může jeden uživatel narušit zabezpečení počítače nahrazením .cs nebo .dll kompilovaného souboru. 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 odešle nepřetržitý datový proud XML na webový server (útok dosílání služby), xmlSerializer bude dál zpracovávat data, dokud počítač nebude málo 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 deserializuje s XmlSerializer, měli byste implementovat podobnou bránu, která brání útoku na dostupnost služby.

  • XmlSerializer serializuje data a spustí jakýkoli kód pomocí libovolného typu daného.

    V které škodlivý objekt představuje hrozbu dvěma způsoby. Mohl by spustit škodlivý kód nebo mohl vložit škodlivý kód do souboru C# vytvořeného XmlSerializer. V druhém případě existuje teoretická možnost, že škodlivý objekt může nějakým způsobem vložit kód do souboru C# vytvořeného 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.

    Jakmile XmlSerializer má 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í ICollection nebo IEnumerable.

    Poznámka:

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

  • XmlElement objekty.

  • Objekty XmlNode .

  • Objekty DataSet

Další informace o serializaci nebo deserializaci objektů naleznete v tématu Postupy: Serializace objektu a postupy: Deserializace objektu.

Výhody použití serializace XML

XmlSerializer třída 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ů, který má být serializován XmlSerializer.

  • Metody nelze serializovat.

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

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

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

    Pro třídy, které implementují ICollection, hodnoty, které mají být serializovány jsou načteny z indexované Item vlastnost místo volání GetEnumerator. Také veřejné pole a vlastnosti nejsou serializovány, s výjimkou veřejných polí, které vracejí jinou třídu kolekce (která implementuje ICollection). Příklad naleznete 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 povoleny ve schématu XSD (XML Schema Definition Language). Pro mnoho 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 definice schématu XML (Xsd.exe)) ke generování tříd ze schématu, použije se příslušný atribut na člena typu řetězec a jeho Vlastnost DataType je nastavena na název datového typu XML. Pokud například schéma obsahuje prvek s názvem "MyToken" s datovým typem XML NMTOKEN, vygenerovaná třída může obsahovat člen, 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ě 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ů naleznete vlastnost DataType pro některou z následujících tříd atributů:

Viz také