XML-serialisatie

Serialisatie is het proces van het converteren van een object naar een formulier dat gemakkelijk kan worden vervoerd. U kunt bijvoorbeeld een object serialiseren en via internet transporteren met behulp van HTTP tussen een client en een server. Aan de andere kant reconstrueert deserialisatie het object uit de stroom.

Xml-serialisatie serialiseert alleen de openbare velden en eigenschapswaarden van een object in een XML-stroom. XML-serialisatie bevat geen typegegevens. Als u bijvoorbeeld een boekobject hebt dat bestaat in de naamruimte Bibliotheek , is er geen garantie dat het wordt gedeserialiseerd in een object van hetzelfde type.

Notitie

XML-serialisatie converteert geen methoden, indexeerfuncties, privévelden of alleen-lezeneigenschappen (behalve alleen-lezenverzamelingen). Als u alle velden en eigenschappen van een object wilt serialiseren, zowel openbaar als privé, gebruikt u de DataContractSerializer in plaats van XML-serialisatie.

De centrale klasse in XML-serialisatie is de XmlSerializer klasse en de belangrijkste methoden in deze klasse zijn de methoden Serialiseren en Deserialiseren . De XmlSerializer C#-bestanden worden gemaakt en gecompileerd in .dll bestanden om deze serialisatie uit te voeren. Het hulpprogramma voor xml-serializergenerator (Sgen.exe) is ontworpen om deze serialisatieassembly's vooraf te genereren om te worden geïmplementeerd met uw toepassing en de opstartprestaties te verbeteren. De XML-stroom die door de XmlSerializer wordt gegenereerd, voldoet aan de aanbeveling WORLD Wide Web Consortium (W3C) XML Schema Definition Language (XSD) 1.0. Bovendien voldoen de gegenereerde gegevenstypen aan het document met de titel 'XML-schema deel 2: Gegevenstypen'.

De gegevens in uw objecten worden beschreven met behulp van programmeertaalconstructies zoals klassen, velden, eigenschappen, primitieve typen, matrices en zelfs ingesloten XML in de vorm van XmlElement - of XmlAttribute-objecten . U kunt uw eigen klassen maken, aantekeningen maken met kenmerken of het hulpprogramma XML-schemadefinitie gebruiken om de klassen te genereren op basis van een bestaand XML-schema.

Als u een XML-schema hebt, kunt u het hulpprogramma XML-schemadefinitie uitvoeren om een set klassen te produceren die sterk zijn getypt in het schema en aantekeningen met kenmerken. Wanneer een exemplaar van een dergelijke klasse wordt geserialiseerd, voldoet de gegenereerde XML aan het XML-schema. Geleverd met een dergelijke klasse, kunt u programmeren op basis van een eenvoudig gemanipuleerd objectmodel terwijl u er zeker van bent dat de gegenereerde XML voldoet aan het XML-schema. Dit is een alternatief voor het gebruik van andere klassen in .NET, zoals de klassen XmlReader en XmlWriter , om een XML-stroom te parseren en schrijven. Zie XML-documenten en -gegevens voor meer informatie. Met deze klassen kunt u elke XML-stroom parseren. Gebruik daarentegen de XmlSerializer wanneer de XML-stroom naar verwachting voldoet aan een bekend XML-schema.

Kenmerken bepalen de XML-stroom die wordt gegenereerd door de klasse XmlSerializer , zodat u de XML-naamruimte, elementnaam, kenmerknaam, enzovoort, van de XML-stroom kunt instellen. Zie XML-serialisatie beheren met behulp van kenmerken voor meer informatie over deze kenmerken en hoe ze XML-serialisatie beheren. Zie Kenmerken die XML-serialisatie bepalen voor een tabel met kenmerken die worden gebruikt om de gegenereerde XML te beheren.

De xmlSerializer-klasse kan een object verder serialiseren en een gecodeerde SOAP XML-stroom genereren. De gegenereerde XML voldoet aan sectie 5 van het World Wide Web Consortium-document met de titel 'Simple Object Access Protocol (SOAP) 1.1'. Zie How to: Serialize an Object as a SOAP-Encoded XML Stream voor meer informatie over dit proces. Zie Attributes That Control Encoded SOAP Serialization voor een tabel met kenmerken die de gegenereerde XML beheren.

De xmlSerializer-klasse genereert de SOAP-berichten die zijn gemaakt door en doorgegeven aan XML-webservices. Als u de SOAP-berichten wilt beheren, kunt u kenmerken toepassen op de klassen, waarden, parameters en velden retourneren die zijn gevonden in een XML-webservicebestand (.asmx). U kunt zowel de kenmerken gebruiken die worden vermeld in 'Kenmerken die XML-serialisatie bepalen' en 'Kenmerken die gecodeerde SOAP-serialisatie bepalen' omdat een XML-webservice de letterlijke of gecodeerde SOAP-stijl kan gebruiken. Zie XML-serialisatie met XML-webservices voor meer informatie over het gebruik van kenmerken om de XML te beheren die is gegenereerd door een XML-webservice. Zie SOAP-berichtopmaak aanpassen voor meer informatie over SOAP- en XML-webservices.

Beveiligingsoverwegingen voor XmlSerializer-toepassingen

Wanneer u een toepassing maakt die gebruikmaakt van xmlSerializer, moet u rekening houden met de volgende items en de gevolgen ervan:

  • XmlSerializer maakt C#-bestanden (.cs) en compileert deze in .dll bestanden in de map met de naam van de TEMP-omgevingsvariabele; serialisatie vindt plaats met deze DLL's.

    Notitie

    Deze serialisatieassembly's kunnen vooraf worden gegenereerd en ondertekend met behulp van het hulpprogramma SGen.exe. Dit werkt niet op een server met webservices. Met andere woorden, het is alleen voor clientgebruik en voor handmatige serialisatie.

    De code en de DLL's zijn kwetsbaar voor een schadelijk proces op het moment van maken en compileren. Het is mogelijk dat twee of meer gebruikers de map TEMP delen. Het delen van een TEMP-map is gevaarlijk als de twee accounts verschillende beveiligingsbevoegdheden hebben en het account met hogere bevoegdheden een toepassing uitvoert met behulp van de XmlSerializer. In dit geval kan één gebruiker de beveiliging van de computer schenden door het .cs of .dll bestand te vervangen dat is gecompileerd. Om dit probleem te voorkomen, moet u er altijd voor zorgen dat elk account op de computer een eigen profiel heeft. De omgevingsvariabele TEMP verwijst standaard naar een andere map voor elk account.

  • Als een kwaadwillende gebruiker een continue stroom XML-gegevens naar een webserver verzendt (een Denial of Service-aanval), blijft de XmlSerializer de gegevens verwerken totdat de computer weinig resources heeft.

    Dit soort aanvallen wordt geëlimineerd als u een computer met Internet Information Services (IIS) gebruikt en uw toepassing wordt uitgevoerd in IIS. IIS bevat een poort die streams niet langer verwerkt dan een ingestelde hoeveelheid (de standaardwaarde is 4 kB). Als u een toepassing maakt die geen gebruik maakt van IIS en deserialisaties met de XmlSerializer, moet u een vergelijkbare poort implementeren die een Denial of Service-aanval voorkomt.

  • De XmlSerializer serialiseert gegevens en voert code uit met behulp van elk type.

    Er zijn twee manieren waarop een schadelijk object een bedreiging vormt. Het kan schadelijke code uitvoeren of schadelijke code injecteren in het C#-bestand dat is gemaakt door de XmlSerializer. In het tweede geval is er een theoretische mogelijkheid dat een schadelijk object op een of andere manier code kan injecteren in het C#-bestand dat is gemaakt door de XmlSerializer. Hoewel dit probleem grondig is onderzocht en een dergelijke aanval als onwaarschijnlijk wordt beschouwd, moet u de voorzorgsmaatregel nemen om nooit gegevens met een onbekend en niet-vertrouwd type te serialiseren.

  • Geserialiseerde gevoelige gegevens zijn mogelijk kwetsbaar.

    Nadat de XmlSerializer geserialiseerde gegevens heeft, kan deze worden opgeslagen als een XML-bestand of een ander gegevensarchief. Als uw gegevensarchief beschikbaar is voor andere processen of zichtbaar is op een intranet of internet, kunnen de gegevens worden gestolen en schadelijk worden gebruikt. Als u bijvoorbeeld een toepassing maakt waarmee orders met creditcardnummers worden geserialiseerd, zijn de gegevens zeer gevoelig. Om dit te voorkomen, beveiligt u altijd het archief voor uw gegevens en voert u stappen uit om deze privé te houden.

Serialisatie van een eenvoudige klasse

In het volgende codevoorbeeld ziet u een basisklasse met een openbaar veld.

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

Wanneer een exemplaar van deze klasse wordt geserialiseerd, kan dit er ongeveer als volgt uitzien.

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

Zie Voorbeelden van XML-serialisatie voor meer voorbeelden van serialisatie.

Items die kunnen worden geserialiseerd

De volgende items kunnen worden geserialiseerd met behulp van de klasse XmlSerializer :

  • Eigenschappen en velden van openbare klassen voor lezen/schrijven.

  • Klassen die ICollection of IEnumerable implementeren.

    Notitie

    Alleen verzamelingen worden geserialiseerd, niet openbare eigenschappen.

  • XmlElement-objecten .

  • XmlNode-objecten .

  • DataSet-objecten .

Zie How to: Serialize an Object and How to: Serialize an Object and How to: Deserialize an Object( Deserialize an Object) voor meer informatie over het serialiseren of deserialiseren van objecten.

Voordelen van het gebruik van XML-serialisatie

De klasse XmlSerializer biedt u volledige en flexibele controle wanneer u een object serialiseert als XML. Als u een XML-webservice maakt, kunt u kenmerken toepassen die serialisatie bepalen op klassen en leden om ervoor te zorgen dat de XML-uitvoer voldoet aan een specifiek schema.

Met XmlSerializer kunt u bijvoorbeeld het volgende doen:

  • Geef op of een veld of eigenschap moet worden gecodeerd als een kenmerk of een element.

  • Geef een XML-naamruimte op die moet worden gebruikt.

  • Geef de naam van een element of kenmerk op als een veld- of eigenschapsnaam ongepast is.

Een ander voordeel van XML-serialisatie is dat u geen beperkingen hebt voor de toepassingen die u ontwikkelt, zolang de XML-stroom die wordt gegenereerd voldoet aan een bepaald schema. Stel u een schema voor dat wordt gebruikt om boeken te beschrijven. Het bevat een titel, auteur, uitgever en ISBN-nummerelement. U kunt een toepassing ontwikkelen waarmee de XML-gegevens op elke gewenste manier worden verwerkt, bijvoorbeeld als boekorder of als voorraad van boeken. In beide gevallen is de enige vereiste dat de XML-stroom voldoet aan het opgegeven XSD-schema (XML Schema Definition Language).

Overwegingen voor XML-serialisatie

Het volgende moet worden overwogen bij het gebruik van de XmlSerializer-klasse :

  • Het hulpprogramma Sgen.exe is uitdrukkelijk ontworpen om serialisatieassembly's te genereren voor optimale prestaties.

  • De geserialiseerde gegevens bevatten alleen de gegevens zelf en de structuur van uw klassen. Typeidentiteits- en assemblygegevens zijn niet opgenomen.

  • Alleen openbare eigenschappen en velden kunnen worden geserialiseerd. Eigenschappen moeten openbare toegangsrechten hebben (methoden ophalen en instellen). Als u niet-openbare gegevens moet serialiseren, gebruikt u de DataContractSerializer klasse in plaats van XML-serialisatie.

  • Een klasse moet een parameterloze constructor hebben om te worden geserialiseerd door XmlSerializer.

  • Methoden kunnen niet worden geserialiseerd.

  • XmlSerializer kan klassen verwerken die IEnumerable of ICollection anders implementeren als ze aan bepaalde vereisten voldoen, als volgt.

    Een klasse die IEnumerable implementeert, moet een openbare add-methode implementeren die één parameter gebruikt. De parameter van de methode Toevoegen moet consistent (polymorf) zijn met het type dat wordt geretourneerd door de eigenschap IEnumerator.Current die is geretourneerd door de GetEnumerator-methode .

    Een klasse die ICollection implementeert naast IEnumerable (zoals CollectionBase), moet een openbare eigenschap item hebben geïndexeerd (een indexeerfunctie in C#) die een geheel getal accepteert en moet een openbare eigenschap Count van het type geheel getal hebben. De parameter die is doorgegeven aan de methode Toevoegen , moet hetzelfde type zijn als de parameter die wordt geretourneerd vanuit de eigenschap Item of een van de bases van dat type.

    Voor klassen die ICollection implementeren, worden waarden die moeten worden geserialiseerd opgehaald uit de eigenschap Geïndexeerd item in plaats van door GetEnumerator aan te roepen. Ook worden openbare velden en eigenschappen niet geserialiseerd, met uitzondering van openbare velden die een andere verzamelingsklasse retourneren (een die ICollection implementeert). Zie Voorbeelden van XML-serialisatie voor een voorbeeld.

XSD-gegevenstypetoewijzing

Het W3C-document getiteld XML-schema deel 2: Gegevenstypen specificeert de eenvoudige gegevenstypen die zijn toegestaan in een XSD-schema (XML Schema Definition Language). Voor veel van deze gegevens (bijvoorbeeld int en decimaal) is er een bijbehorend gegevenstype in .NET. Sommige XML-gegevenstypen hebben echter geen bijbehorend .NET-gegevenstype, bijvoorbeeld het NMTOKEN-gegevenstype . Als u in dergelijke gevallen het hulpprogramma XML-schemadefinitie (XML Schema Definition Tool (Xsd.exe)) gebruikt om klassen te genereren op basis van een schema, wordt een geschikt kenmerk toegepast op een lid van de typetekenreeks en wordt de eigenschap DataType ervan ingesteld op de naam van het XML-gegevenstype. Als een schema bijvoorbeeld een element bevat met de naam 'MyToken' met het XML-gegevenstype NMTOKEN, kan de gegenereerde klasse een lid bevatten, zoals wordt weergegeven in het volgende voorbeeld.

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

Als u een klasse maakt die moet voldoen aan een specifiek XML-schema (XSD), moet u het juiste kenmerk toepassen en de bijbehorende DataType-eigenschap instellen op de naam van het gewenste XML-gegevenstype.

Zie de eigenschap DataType voor een van de volgende kenmerkklassen voor een volledige lijst met typetoewijzingen:

Zie ook