Serializacja XML
Serializacji to proces konwersji obiektu do formularza, który można łatwo przesłać. Na przykład można serializować obiekt i transportować go przez Internet przy użyciu protokołu HTTP między klientem a serwerem. Z drugiej deserializacji rekonstruuje obiektów ze strumienia.
Wykonuje serializacji XML serializację tylko publiczny pól i wartości właściwości obiektu do strumienia XML. Serializacji XML nie zawiera informacji o typie. Jeśli na przykład masz obiekt Book , który istnieje w przestrzeni nazw Biblioteka , nie ma gwarancji, że jest deserializowany do obiektu tego samego typu.
Uwaga
Serializacji XML nie konwertuje metody, indeksatory, prywatnych pola lub właściwości tylko do odczytu (z wyjątkiem kolekcji tylko do odczytu). Do serializacji obiektu wszystkie pola i właściwości, zarówno publiczne, jak i prywatnych, użyj DataContractSerializer zamiast serializacji XML.
Centralna klasa w serializacji XML jest klasą XmlSerializer , a najważniejszymi metodami w tej klasie są metody Serialize i Deserialize . XmlSerializer Tworzy PLiki C# i kompiluje je na PLiki z rozszerzeniem dll do wykonania tej serializacji. Narzędzie generatora serializatora XML (Sgen.exe) zostało zaprojektowane pod kątem wcześniejszego wygenerowania tych zestawów serializacji w celu wdrożenia za pomocą aplikacji i zwiększenia wydajności uruchamiania. Strumień XML wygenerowany przez moduł XmlSerializer jest zgodny z zaleceniem języka definicji schematu XML (XSD) w wersji 1.0 dla konsorcjum World Wide Web Consortium (W3C). Ponadto wygenerowane typy danych są zgodne z dokumentem zatytułowanym "XML Schema Part 2: Datatypes".
Dane w obiektach są opisywane przy użyciu konstrukcji języka programowania, takich jak klasy, pola, właściwości, typy pierwotne, tablice, a nawet osadzony kod XML w postaci obiektów XmlElement lub XmlAttribute . Istnieje możliwość tworzenia własnych klas oznaczona z atrybutów, lub za pomocą narzędzia definicji schematu XML można wygenerować klas na podstawie istniejącego schematu XML.
Jeśli masz schematu XML, należy uruchomić narzędzie definicji schematu XML do tworzenia zestaw klasy, które są silnie wpisany schematu i dodawać adnotacje z atrybutami. W przypadku wystąpienia takich klasy jest serializowana, wygenerowany kod XML jest zgodna schematu XML. Zamieszczone w przypadku klasy, można programować względem model obiektów łatwo manipulować spełniającą pewność, że wygenerowany kod XML jest zgodny ze schematem XML. Jest to alternatywa dla używania innych klas na platformie .NET, takich jak klasy XmlReader i XmlWriter , do analizowania i pisania strumienia XML. Aby uzyskać więcej informacji, zobacz Dokumenty XML i dane. Klasy te umożliwiają przeanalizować strumieniem XML. Z kolei użyj klasy XmlSerializer , gdy strumień XML ma być zgodny ze znanym schematem XML.
Atrybuty kontrolują strumień XML wygenerowany przez klasę XmlSerializer , umożliwiając ustawienie przestrzeni nazw XML, nazwy elementu, nazwy atrybutu itd. strumienia XML. Aby uzyskać więcej informacji na temat tych atrybutów i sposobu kontrolowania serializacji XML, zobacz Kontrolowanie serializacji XML przy użyciu atrybutów. Aby zapoznać się z tabelą tych atrybutów, które są używane do kontrolowania wygenerowanego kodu XML, zobacz Atrybuty, które kontrolują serializacji XML.
Klasa XmlSerializer może dodatkowo serializować obiekt i generować zakodowany strumień XML protokołu SOAP. Wygenerowany kod XML jest zgodny z sekcją 5 dokumentu World Wide Web Consortium zatytułowanym "Simple Object Access Protocol (SOAP) 1.1". Aby uzyskać więcej informacji na temat tego procesu, zobacz How to: Serialize an Object as a SOAP-Encoded XML Stream (Jak serializować obiekt jako strumień XML zakodowany za pomocą protokołu SOAP). Aby uzyskać tabelę atrybutów kontrolujących wygenerowany kod XML, zobacz Atrybuty, które kontrolują zakodowaną serializacji protokołu SOAP.
Klasa XmlSerializer generuje komunikaty PROTOKOŁU SOAP utworzone przez i przekazywane do usług sieci Web XML. Aby kontrolować komunikaty PROTOKOŁU SOAP, można zastosować atrybuty do klas, zwracać wartości, parametry i pola znalezione w pliku usługi sieci Web XML (asmx). Można użyć atrybuty wymienione w "Serializacji XML atrybuty czy kontroli" i "Atrybuty czy kontroli kodowany protokołu SOAP serializacji", ponieważ usługi XML sieci Web mogą korzystać styl literału lub zakodowanego protokołu SOAP. Aby uzyskać więcej informacji na temat używania atrybutów do kontrolowania kodu XML wygenerowanego przez usługę sieci Web XML, zobacz Serializacja XML z usługami sieci Web XML. Aby uzyskać więcej informacji na temat usług sieci Web PROTOKOŁU SOAP i XML, zobacz Dostosowywanie formatowania komunikatów PROTOKOŁU SOAP.
Zagadnienia dotyczące zabezpieczeń aplikacji XmlSerializer
Podczas tworzenia aplikacji korzystającej z narzędzia XmlSerializer należy pamiętać o następujących elementach i ich implikacjach:
Narzędzie XmlSerializer tworzy pliki języka C# (.cs) i kompiluje je do plików .dll w katalogu o nazwie zmiennej środowiskowej TEMP; serializacja odbywa się z tymi bibliotekami DLL.
Uwaga
Te zestawy serializacji można wygenerowane z góry i podpisane za pomocą narzędzia SGen.exe. Nie działa to na serwerze usług sieci Web. Innymi słowy jest tylko do użytku klienta i ręczne serializacji.
Kod i biblioteki DLL są podatne na złośliwego procesu w czasie tworzenia i kompilacji. Może być możliwe udostępnienie katalogu TEMP przez co najmniej dwóch użytkowników. Udostępnianie katalogu TEMP jest niebezpieczne, jeśli dwa konta mają różne uprawnienia zabezpieczeń, a konto wyższego poziomu uprawnień uruchamia aplikację przy użyciu narzędzia XmlSerializer. W takim przypadku jeden użytkownik może naruszyć zabezpieczenia komputera, zastępując .cs lub .dll skompilowany plik. Aby usunąć ten problem, zawsze upewnij się, że każde konto na komputerze ma własny profil. Domyślnie zmienna środowiskowa TEMP wskazuje inny folder dla każdego konta.
Jeśli złośliwy użytkownik wysyła ciągły strumień danych XML do serwera sieci Web (atak typu "odmowa usługi"), narzędzie XmlSerializer będzie nadal przetwarzać dane, dopóki komputer nie będzie działać nisko na zasobach.
Ten rodzaj ataku jest wyeliminowany, jeśli używasz komputera z uruchomionymi usługami Internet Information Services (IIS), a aplikacja działa w usługach IIS. Program IIS zawiera bramę, która nie może przetwarzać strumieni dłużej niż pewną liczbę (wartość domyślna to 4 KB). Jeśli tworzysz aplikację, która nie korzysta z usług IIS i deserializuje element XmlSerializer, należy zaimplementować podobną bramę, która uniemożliwia atak typu "odmowa usługi".
Moduł XmlSerializer serializuje dane i uruchamia dowolny kod przy użyciu dowolnego typu podanego dla niego.
Istnieją dwie metody, w których obiekt złośliwego przedstawia zagrożenia. Może on uruchomić złośliwy kod lub wstrzyknąć złośliwy kod do pliku C# utworzonego przez narzędzie XmlSerializer. W drugim przypadku istnieje teoretyczna możliwość, że złośliwy obiekt może w jakiś sposób wstrzyknąć kod do pliku C# utworzonego przez narzędzie XmlSerializer. Mimo że ten problem zbadaniu dokładnie i takiego ataku jest uznawany za mało prawdopodobne, należy podjąć środki ostrożności nigdy nie szeregowania danych o typie nieznany i niezaufane.
Zserializowany poufnych danych może być narażony.
Po serializacji danych xmlSerializer można je przechowywać jako plik XML lub inny magazyn danych. Sklepu danych jest dostępna dla innych procesów, czy jest widoczny w intranecie lub w Internecie, dane mogą skradziony i użyty w sposób złośliwy. Jeśli na przykład utworzysz aplikację, która serializuje zamówienia zawierające numery kart kredytowych, dane są bardzo wrażliwe. Aby zapobiec, zawsze ochrony magazynu danych i wykonać kroki, aby utrzymać ją prywatnych.
Serializacja prostej klasy
Poniższy przykład kodu przedstawia klasę podstawową z polem publicznym.
Public Class OrderForm
Public OrderDate As DateTime
End Class
public class OrderForm
{
public DateTime OrderDate;
}
W przypadku wystąpienia tej klasy jest serializowana, jego może wyglądać w następujący sposób.
<OrderForm>
<OrderDate>12/12/01</OrderDate>
</OrderForm>
Aby uzyskać więcej przykładów serializacji, zobacz Przykłady serializacji XML.
Elementy, które można wykonywać serializację
Następujące elementy można serializować przy użyciu klasy XmlSerializer :
Właściwości publiczne odczytu/zapisu i pola publiczne klas.
Klasy implementujące ICollection lub IEnumerable.
Uwaga
Tylko kolekcje są serializacji, nie publiczny właściwości.
Obiekty XmlElement .
Obiekty XmlNode .
Obiekty Zestawu danych.
Aby uzyskać więcej informacji na temat serializacji lub deserializacji obiektów, zobacz Instrukcje: serializowanie obiektu i Instrukcje: Deserializowanie obiektu.
Korzyści wynikające z używania serializacji XML
Klasa XmlSerializer zapewnia kompletną i elastyczną kontrolę podczas serializacji obiektu jako XML. Jeśli tworzysz usługę sieci Web XML, możesz zastosować atrybuty kontrolujące serializacji do klas i elementów członkowskich, aby upewnić się, że dane wyjściowe XML są zgodne z określonym schematem.
Na przykład funkcja XmlSerializer umożliwia:
Określ, czy pole lub właściwość powinien być kodowany jako atrybut lub element.
Określ przestrzeni nazw XML do użycia.
Określ nazwę elementu lub atrybutu, jeśli nazwa pola lub właściwości jest nieodpowiedni.
Kolejną zaletą serializacji XML jest to, że nie masz ograniczeń dotyczących tworzonych aplikacji, o ile strumień XML, który jest generowany, jest zgodny z danym schematem. Wyobraź sobie schematu, używany do opisania książki. Zawiera funkcje tytuł, autor, Wydawca i ISBN numer elementu. Możesz opracować aplikację, która przetwarza dane XML w dowolny sposób, na przykład jako zamówienie książki lub jako spis książek. W obu przypadkach jedynym wymaganiem jest, czy strumień XML jest zgodny ze schematem określonego języka (XSD) definicji schematu XML.
Uwagi dotyczące serializacji XML
Podczas korzystania z klasy XmlSerializer należy wziąć pod uwagę następujące kwestie:
Narzędzie Sgen.exe wyraźnie jest przeznaczona do generowania zestawów serializacji w celu uzyskania optymalnej wydajności.
Serializowane dane zawiera tylko danych i struktury klas. Informacje o tożsamości i zestawu typu nie są uwzględniane.
Może być Zserializowany tylko właściwości publiczne i pola. Właściwości muszą mieć publiczne metody dostępu (Pobieranie i ustawianie metody). Jeśli muszą serializację danych bez publicznego, użyj DataContractSerializer klasy zamiast serializacji XML.
Klasa musi mieć konstruktor bez parametrów do serializacji przez xmlSerializer.
Nie można serializować metody.
XmlSerializer może przetwarzać klasy, które implementują funkcję IEnumerable lub ICollection inaczej, jeśli spełniają określone wymagania w następujący sposób.
Klasa, która implementuje funkcję IEnumerable , musi zaimplementować publiczną metodę Add , która przyjmuje pojedynczy parametr. Parametr metody Add musi być spójny (polimorficzny) z typem zwróconym z właściwości IEnumerator.Current zwróconej z metody GetEnumerator.
Klasa, która implementuje funkcję ICollection oprócz elementu IEnumerable (na przykład CollectionBase), musi mieć właściwość indeksowaną elementu publicznego(indeksator w języku C#), która przyjmuje liczbę całkowitą i musi mieć właściwość liczba publiczna typu liczba całkowita. Parametr przekazany do metody Add musi być tego samego typu co parametr zwrócony z właściwości Item lub jeden z baz tego typu.
W przypadku klas implementujących ICollection wartości, które mają być serializowane, są pobierane z właściwości indeksowanego elementu, a nie przez wywołanie metody GetEnumerator. Ponadto pola publiczne i właściwości nie są serializowane, z wyjątkiem pól publicznych, które zwracają inną klasę kolekcji (taką, która implementuje ICollection). Aby zapoznać się z przykładem, zobacz Przykłady serializacji XML.
Mapowania typów danych XSD
Dokument W3C zatytułowany Schemat XML — część 2: Typy danych określa proste typy danych, które są dozwolone w schemacie języka definicji schematu XML (XSD). W przypadku wielu z nich (na przykład int i dziesiętnych) odpowiedni typ danych jest dostępny na platformie .NET. Jednak niektóre typy danych XML nie mają odpowiedniego typu danych platformy .NET, na przykład typu danych NMTOKEN . W takich przypadkach, jeśli używasz narzędzia definicji schematu XML (narzędzie definicji schematu XML (Xsd.exe)) do generowania klas ze schematu, odpowiedni atrybut jest stosowany do elementu członkowskiego ciągu typu, a jego właściwość DataType jest ustawiona na nazwę typu danych XML. Jeśli na przykład schemat zawiera element o nazwie "MyToken" z typem danych XML NMTOKEN, wygenerowana klasa może zawierać składową, jak pokazano w poniższym przykładzie.
<XmlElement(DataType:="NMTOKEN")> _
Public MyToken As String
[XmlElement(DataType = "NMTOKEN")]
public string MyToken;
Podobnie, jeśli tworzysz klasę, która musi być zgodna z określonym schematem XML (XSD), należy zastosować odpowiedni atrybut i ustawić jego właściwość DataType na żądaną nazwę typu danych XML.
Aby uzyskać pełną listę mapowań typów, zobacz właściwość DataType dla dowolnej z następujących klas atrybutów: