Share via


XML-serialisering

Serialisering är processen att konvertera ett objekt till ett formulär som lätt kan transporteras. Du kan till exempel serialisera ett objekt och transportera det via Internet med http mellan en klient och en server. I andra änden rekonstruerar deserialiseringen objektet från strömmen.

XML-serialisering serialiserar endast offentliga fält och egenskapsvärden för ett objekt till en XML-dataström. XML-serialisering innehåller inte typinformation. Om du till exempel har ett bokobjekt som finns i namnområdet Bibliotek finns det ingen garanti för att det deserialiseras till ett objekt av samma typ.

Kommentar

XML-serialisering konverterar inte metoder, indexerare, privata fält eller skrivskyddade egenskaper (förutom skrivskyddade samlingar). Om du vill serialisera alla ett objekts fält och egenskaper, både offentliga och privata, använder du DataContractSerializer i stället för XML-serialisering.

Den centrala klassen i XML-serialisering är XmlSerializer klassen och de viktigaste metoderna i den här klassen är metoderna Serialisera och Deserialisera . XmlSerializer Skapar C#-filer och kompilerar dem i .dll filer för att utföra den här serialiseringen. XML Serializer Generator Tool (Sgen.exe) är utformat för att generera dessa serialiseringssammansättningar i förväg för att distribueras med ditt program och förbättra startprestanda. XML-dataströmmen som genereras av XmlSerializer är kompatibel med W3C-rekommendationen (W3C) XML Schema definition language (XSD) 1.0. Dessutom är de datatyper som genereras kompatibla med dokumentet "XML-schema del 2: Datatyper".

Data i dina objekt beskrivs med hjälp av programmeringsspråkkonstruktioner som klasser, fält, egenskaper, primitiva typer, matriser och till och med inbäddad XML i form av XmlElement - eller XmlAttribute-objekt . Du kan välja att skapa egna klasser, kommenterat med attribut eller använda XML-schemadefinitionsverktyget för att generera klasserna baserat på ett befintligt XML-schema.

Om du har ett XML-schema kan du köra xml-schemadefinitionsverktyget för att skapa en uppsättning klasser som är starkt inskrivna i schemat och kommenterade med attribut. När en instans av en sådan klass serialiseras följer den genererade XML-koden XML-schemat. Försedd med en sådan klass kan du programmera mot en lättmanipulerad objektmodell samtidigt som du är säker på att den genererade XML-koden överensstämmer med XML-schemat. Det här är ett alternativ till att använda andra klasser i .NET, till exempel klasserna XmlReader och XmlWriter , för att parsa och skriva en XML-dataström. Mer information finns i XML-dokument och -data. Med de här klasserna kan du parsa alla XML-strömmar. Använd däremot XmlSerializer när XML-strömmen förväntas överensstämma med ett känt XML-schema.

Attribut styr XML-strömmen som genereras av klassen XmlSerializer , så att du kan ange XML-namnområdet, elementnamnet, attributnamnet och så vidare för XML-strömmen. Mer information om dessa attribut och hur de styr XML-serialisering finns i Kontrollera XML-serialisering med hjälp av attribut. En tabell med de attribut som används för att styra den genererade XML-koden finns i Attribut som styr XML-serialisering.

Klassen XmlSerializer kan ytterligare serialisera ett objekt och generera en kodad SOAP XML-ström. Den genererade XML-koden följer avsnitt 5 i world wide web consortium-dokumentet med titeln "Simple Object Access Protocol (SOAP) 1.1". Mer information om den här processen finns i Så här serialiserar du ett objekt som en SOAP-kodad XML-ström. En tabell med attributen som styr den genererade XML-koden finns i Attribut som styr kodad SOAP-serialisering.

Klassen XmlSerializer genererar SOAP-meddelanden som skapats av och skickats till XML-webbtjänster. Om du vill styra SOAP-meddelandena kan du använda attribut för klasserna, returnera värden, parametrar och fält som finns i en XML-webbtjänstfil (.asmx). Du kan använda både attributen som anges i "Attribut som styr XML-serialisering" och "Attribut som styr kodad SOAP-serialisering" eftersom en XML-webbtjänst kan använda antingen den literala eller kodade SOAP-stilen. Mer information om hur du använder attribut för att styra XML som genereras av en XML-webbtjänst finns i XML-serialisering med XML Web Services. Mer information om SOAP- och XML-webbtjänster finns i Anpassa SOAP-meddelandeformatering.

Säkerhetsöverväganden för XmlSerializer-program

När du skapar ett program som använder XmlSerializer bör du vara medveten om följande objekt och deras konsekvenser:

  • XmlSerializer skapar C#-filer (.cs) och kompilerar dem till .dll filer i katalogen som heter av temp-miljövariabeln. Serialisering sker med dessa DLL:er.

    Kommentar

    Dessa serialiseringssammansättningar kan genereras i förväg och signeras med hjälp av verktyget SGen.exe. Detta fungerar inte på en server med webbtjänster. Med andra ord är det bara för klientanvändning och för manuell serialisering.

    Koden och DLL:erna är sårbara för en skadlig process vid tidpunkten för skapande och kompilering. Det kan vara möjligt för två eller flera användare att dela TEMP-katalogen. Det är farligt att dela en TEMP-katalog om de två kontona har olika säkerhetsbehörigheter och kontot med högre behörighet kör ett program med hjälp av XmlSerializer. I det här fallet kan en användare bryta mot datorns säkerhet genom att antingen ersätta .cs eller .dll fil som kompileras. För att eliminera detta problem måste du alltid se till att varje konto på datorn har en egen profil. Som standard pekar temp-miljövariabeln på en annan katalog för varje konto.

  • Om en obehörig användare skickar en kontinuerlig ström av XML-data till en webbserver (en överbelastningsattack) fortsätter XmlSerializer att bearbeta data tills datorn har ont om resurser.

    Den här typen av angrepp elimineras om du använder en dator som kör IIS (Internet Information Services) och programmet körs i IIS. IIS har en grind som inte bearbetar strömmar längre än en angivet belopp (standardvärdet är 4 KB). Om du skapar ett program som inte använder IIS och deserialiserar med XmlSerializer bör du implementera en liknande grind som förhindrar en överbelastningsattack.

  • XmlSerializer serialiserar data och kör valfri kod med valfri typ.

    Det finns två sätt på vilka ett skadligt objekt utgör ett hot. Den kan köra skadlig kod eller mata in skadlig kod i C#-filen som skapats av XmlSerializer. I det andra fallet finns det en teoretisk möjlighet att ett skadligt objekt på något sätt kan mata in kod i C#-filen som skapats av XmlSerializer. Även om det här problemet har undersökts noggrant, och en sådan attack anses osannolik, bör du vidta försiktighetsåtgärder för att aldrig serialisera data med en okänd och obetrodd typ.

  • Serialiserade känsliga data kan vara sårbara.

    När XmlSerializer har serialiserade data kan den lagras som en XML-fil eller ett annat datalager. Om ditt datalager är tillgängligt för andra processer eller är synligt på ett intranät eller på Internet kan data stjälas och användas på ett skadligt sätt. Om du till exempel skapar ett program som serialiserar beställningar som innehåller kreditkortsnummer är data mycket känsliga. För att förhindra detta skyddar du alltid lagringen för dina data och vidtar åtgärder för att hålla den privat.

Serialisering av en enkel klass

I följande kodexempel visas en grundläggande klass med ett offentligt fält.

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

När en instans av den här klassen serialiseras kan den likna följande.

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

Fler exempel på serialisering finns i Exempel på XML-serialisering.

Objekt som kan serialiseras

Följande objekt kan serialiseras med klassen XmlSerializer :

  • Offentliga läs-/skrivegenskaper och fält för offentliga klasser.

  • Klasser som implementerar ICollection eller IEnumerable.

    Kommentar

    Endast samlingar är serialiserade, inte offentliga egenskaper.

  • XmlElement-objekt .

  • XmlNode-objekt .

  • DataSet-objekt .

Mer information om serialisering eller deserialisering av objekt finns i Så här serialiserar du ett objekt och Gör så här: Deserialisera ett objekt.

Fördelar med att använda XML-serialisering

Klassen XmlSerializer ger dig fullständig och flexibel kontroll när du serialiserar ett objekt som XML. Om du skapar en XML-webbtjänst kan du använda attribut som styr serialisering för klasser och medlemmar för att säkerställa att XML-utdata överensstämmer med ett specifikt schema.

Med XmlSerializer kan du till exempel:

  • Ange om ett fält eller en egenskap ska kodas som ett attribut eller ett element.

  • Ange ett XML-namnområde som ska användas.

  • Ange namnet på ett element eller attribut om ett fält eller egenskapsnamn är olämpligt.

En annan fördel med XML-serialisering är att du inte har några begränsningar för de program som du utvecklar, så länge XML-dataströmmen som genereras överensstämmer med ett visst schema. Föreställ dig ett schema som används för att beskriva böcker. Den innehåller ett nummerelement för titel, författare, utgivare och ISBN. Du kan utveckla ett program som bearbetar XML-data på valfritt sätt, till exempel som en bokbeställning eller som en inventering av böcker. I båda fallen är det enda kravet att XML-dataströmmen överensstämmer med det angivna XSD-schemat (XML Schema Definition Language).

Överväganden för XML-serialisering

Följande bör beaktas när du använder klassen XmlSerializer :

  • Verktyget Sgen.exe är uttryckligen utformat för att generera serialiseringssammansättningar för optimal prestanda.

  • Serialiserade data innehåller endast själva data och strukturen för dina klasser. Typidentitets- och sammansättningsinformation ingår inte.

  • Endast offentliga egenskaper och fält kan serialiseras. Egenskaper måste ha offentliga accessorer (hämta och ange metoder). Om du måste serialisera icke-offentliga data använder du DataContractSerializer klassen i stället för XML-serialisering.

  • En klass måste ha en parameterlös konstruktor som ska serialiseras av XmlSerializer.

  • Metoder kan inte serialiseras.

  • XmlSerializer kan bearbeta klasser som implementerar IEnumerable eller ICollection på olika sätt om de uppfyller vissa krav, enligt följande.

    En klass som implementerar IEnumerable måste implementera en offentlig Lägg till-metod som tar en enda parameter. Parametern Lägg till metod måste vara konsekvent (polymorf) med den typ som returneras från egenskapen IEnumerator.Current som returneras från metoden GetEnumerator.

    En klass som implementerar ICollection utöver IEnumerable (till exempel CollectionBase) måste ha en indexerad egenskap för offentligt objekt (en indexerare i C#) som tar ett heltal och måste ha en offentlig count-egenskap av typen heltal. Parametern som skickas till metoden Lägg till måste vara av samma typ som den som returnerades från egenskapen Item eller någon av den typens baser.

    För klasser som implementerar ICollection hämtas värden som ska serialiseras från egenskapen indexerat objekt i stället för genom att anropa GetEnumerator. Dessutom serialiseras inte offentliga fält och egenskaper, med undantag för offentliga fält som returnerar en annan samlingsklass (en som implementerar ICollection). Ett exempel finns i Exempel på XML-serialisering.

Mappning av XSD-datatyp

W3C-dokumentet med titeln XML Schema Del 2: Datatyper anger de enkla datatyper som tillåts i ett XSD-schema (XML Schema Definition Language). För många av dessa (till exempel int och decimal) finns det en motsvarande datatyp i .NET. Vissa XML-datatyper har dock ingen motsvarande .NET-datatyp, till exempel NMTOKEN-datatypen . I sådana fall, om du använder XML-schemadefinitionsverktyget (XML Schema Definition Tool (Xsd.exe)) för att generera klasser från ett schema, tillämpas ett lämpligt attribut på en medlem av typsträngen och dess DataType-egenskap är inställd på XML-datatypens namn. Om ett schema till exempel innehåller ett element med namnet "MyToken" med XML-datatypen NMTOKEN, kan den genererade klassen innehålla en medlem enligt följande exempel.

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

Om du skapar en klass som måste överensstämma med ett specifikt XML-schema (XSD) bör du använda lämpligt attribut och ange dess DataType-egenskap till önskat XML-datatypnamn.

En fullständig lista över typmappningar finns i egenskapen DataType för någon av följande attributklasser:

Se även