Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Serializace je proces převodu objektu na formulář, který lze snadno přenést. Můžete například serializovat objekt a přenést ho přes internet pomocí protokolu HTTP mezi klientem a serverem. Deserializace na druhé straně rekonstruuje objekt z datového proudu.
Serializace XML serializuje pouze veřejná pole a hodnoty vlastností objektu do datového proudu 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í metody, indexery, privátní pole ani vlastnosti jen pro čtení (s výjimkou kolekcí jen pro čtení). Chcete-li serializovat všechna pole a vlastnosti objektu, veřejné i soukromé, použijte DataContractSerializer mí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 C# a zkompiluje je do souborů .dll pro provedení této 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 v souladu s doporučením Světového konsorcia pro web (W3C) pro jazyk definice schématu XML (XSD) 1.0. Kromě toho jsou datové typy vygenerované v souladu s dokumentem s názvem Xml Schema Part 2: Datatypes.
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, anotovat pomocí atributů nebo pomocí nástroje definice schématu XML vygenerovat třídy založené na existujícím schématu XML.
Pokud máte schéma XML, můžete spustit nástroj XML Schema Definition k vytvoření sady tříd, které jsou silně typovány podle schématu a anotovány atributy. Pokud je instance takové třídy serializována, vygenerovaný XML dodržuje schématu XML. Pokud máte k dispozici takovou třídu, můžete programovat proti snadno manipulovatelnému objektovému modelu a zároveň mít jistotu, že vygenerovaný 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í parsovat libovolný 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ý třídou XmlSerializer, což umožňuje nastavit obor názvů XML, název elementu, název atributu atd. XML proudu. 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-Encoded 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 SOAP, můžete použít atributy na třídy, vrátit hodnoty, parametry a pole nalezené v souboru webové služby XML (.asmx). Můžete použít jak atributy uvedené v části Atributy, které řídí serializaci XML, tak atributy, které řídí kódované serializace SOAP, protože webová služba XML může použít literál nebo kódovaný styl SOAP. 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 aplikace XmlSerializer
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; k serializaci dochází u těchto knihoven DLL.
Poznámka:
Tato sestavení serializace lze předem vygenerovat a podepsat pomocí nástroje SGen.exe. To nefunguje na serveru webových služeb. Jinými slovy, je to pouze pro použití klienta a pro ruční serializaci.
Kód a knihovny DLL jsou ohroženy škodlivým procesem v době vytváření a kompilace. 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 se ujistěte, že každý účet v počítači má svůj vlastní profil. Ve výchozím nastavení proměnná prostředí TEMP směřuje na různé adresáře pro každý uživatelský účet.
Pokud škodlivý uživatel odešle nepřetržitý proud XML dat na webový server (útok typu odmítnutí služby), XmlSerializer bude pokračovat ve zpracování dat, dokud počítači nedojdou prostředky.
Tento druh útoku se eliminuje, pokud používáte počítač se spuštěnou internetovou informační službou (IIS) a vaše aplikace běží ve službě IIS. Služba IIS obsahuje bránu, která nezpracovává datové proudy delší než nastavená částka (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í jakéhokoli typu, který ji byl předán.
Š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ž byl tento problém důkladně zkoumán a takový útok je považován za nepravděpodobné, měli byste přijmout opatření, abyste nikdy serializovali data s neznámým a nedůvěryhodným typem.
Serializovaná citlivá data mohou být zranitelná.
Jakmile XmlSerializer má serializovaná data, může být uložen jako soubor XML nebo jiné úložiště dat. Pokud je vaše úložiště dat dostupné pro jiné procesy nebo je viditelné v intranetu nebo internetu, můžou se data ukrást a zneužít. Pokud například vytvoříte aplikaci, která serializuje objednávky, které obsahují čísla platebních karet, jsou data vysoce citlivá. Abyste tomu zabránili, vždy chraňte úložiště vašich dat a proveďte kroky, které je zachovávají jako soukromé.
Serializace jednoduché třídy
Následující příklad kódu ukazuje základní třídu s veřejným polem.
Public Class OrderForm
Public OrderDate As DateTime
End Class
public class OrderForm
{
public DateTime OrderDate;
}
Pokud je instance této třídy serializována, může vypadat podobně jako následující.
<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 :
Veřejné vlastnosti čtení/zápisu a pole veřejných tříd.
Třídy, které implementují ICollection nebo IEnumerable.
Poznámka:
Pouze kolekce jsou serializovány, nikoli 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 webovou službu XML, můžete použít atributy, které řídí serializaci tříd a členů, aby se zajistilo, že výstup XML odpovídá určitému schématu.
Například XmlSerializer umožňuje:
Určete, zda má být pole nebo vlastnost kódována jako atribut nebo prvek.
Zadejte obor názvů XML, který se má použít.
Zadejte název elementu nebo atributu, pokud je název pole nebo vlastnosti nevhodný.
Další výhodou serializace XML je, že nemáte žádná omezení pro aplikace, které vyvíjíte, pokud datový proud XML generovaný odpovídá danému schématu. Představte si schéma, které se používá k popisu knih. Obsahuje název, autora, vydavatele a číselný prvek ISBN. Můžete vyvíjet aplikaci, která zpracovává data XML libovolným způsobem, například jako objednávku knihy nebo jako inventář knih. V obou případech je jediným požadavkem, aby datový proud XML odpovídal zadanému schématu XSD (XML Schema Definition Language).
Aspekty serializace XML
Při použití třídy XmlSerializer je třeba zvážit následující:
Nástroj Sgen.exe je výslovně navržen tak, aby generoval sestavení serializace pro optimální výkon.
Serializovaná data obsahují pouze samotná data a strukturu vašich tříd. Informace o identitě typu a sestavení nejsou zahrnuty.
Serializovat lze pouze veřejné vlastnosti a pole. Vlastnosti musí mít veřejné metody přístupu (get a set metody). Pokud je nutné serializovat neveřejná data, použijte DataContractSerializer třídu místo 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 metody Add musí být konzistentní (polymorfní) s typem vráceným z vlastnosti IEnumerator.Current, která je vrácená z metody GetEnumerator.
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í datových typů 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 pro člena řetězce typu 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.
Pro úplný seznam mapování typů viz vlastnost DataType u některé z následujících tříd atributů: