Dela via


System.Runtime.Serialization.DataContractSerializer-klass

Den här artikeln innehåller ytterligare kommentarer till referensdokumentationen för det här API:et.

DataContractSerializer Använd klassen för att serialisera och deserialisera instanser av en typ till en XML-dataström eller ett dokument. Du kan till exempel skapa en typ med namnet Person med egenskaper som innehåller viktiga data, till exempel ett namn och en adress. Du kan sedan skapa och ändra en instans av Person klassen och skriva alla dess egenskapsvärden i ett XML-dokument för senare hämtning eller i en XML-dataström för omedelbar transport. Viktigast av allt är att DataContractSerializer används för att serialisera och deserialisera data som skickas i WCF-meddelanden (Windows Communication Foundation). DataContractAttribute Använd attributet för klasser och DataMemberAttribute attributet för klassmedlemmar för att ange egenskaper och fält som serialiseras.

En lista över typer som kan serialiseras finns i Typer som stöds av Data Contract Serializer.

Om du vill använda DataContractSerializerskapar du först en instans av en klass och ett objekt som är lämpligt för att skriva eller läsa formatet, till exempel en instans av XmlDictionaryWriter. Anropa WriteObject sedan metoden för att spara data. Om du vill hämta data skapar du ett objekt som är lämpligt för att läsa dataformatet (till exempel ett XmlDictionaryReader för ett XML-dokument) och anropa ReadObject metoden.

Mer information om hur du använder finns i DataContractSerializerSerialisering och deserialisering.

Du kan ange typen av en datakontrakts serialiserare med hjälp av elementet< dataContractSerializer> i en konfigurationsfil för klientprogram.

Förbereda klasser för serialisering eller deserialisering

DataContractSerializer Används i kombination med klasserna DataContractAttribute och DataMemberAttribute . För att förbereda en klass för serialisering, tillämpa DataContractAttribute på klassen. För varje medlem i klassen som returnerar data som du vill serialisera, använd DataMemberAttribute. Du kan serialisera fält och egenskaper, oavsett tillgänglighet: privat, skyddad, intern, skyddad intern eller offentlig.

Ditt schema anger till exempel en Customer med en ID egenskap, men du har redan ett befintligt program som använder en typ med namnet Person med en Name egenskap. För att skapa en typ som överensstämmer med kontraktet tillämpar du först DataContractAttribute på klassen. Använd sedan DataMemberAttribute på varje fält eller egenskap som du vill serialisera.

Anmärkning

Du kan använda DataMemberAttribute på både privata och offentliga medlemmar.

Det slutliga formatet för XML-koden behöver inte vara text. I stället skriver DataContractSerializer data som en XML-informationsuppsättning, vilket gör att du kan skriva data till alla format som igenkänns av XmlReader och XmlWriter. Vi rekommenderar att du använder klasserna XmlDictionaryReader och XmlDictionaryWriter för att läsa och skriva, eftersom båda är optimerade för att fungera med DataContractSerializer.

Om du skapar en klass som har fält eller egenskaper som måste anges innan serialiseringen eller deserialiseringen sker, ska du använda återanropsattribut som beskrivs i Version-Tolerant Serialiseringsåteranrop.

Lägg till i samlingen med kända typer

När du serialiserar eller deserialiserar ett objekt krävs det att typen är "känd" för DataContractSerializer. Börja med att skapa en instans av en klass som implementerar IEnumerable<T> (till exempel List<T>) och lägga till kända typer i samlingen. Skapa sedan en instans av DataContractSerializer med hjälp av en av de överlagringar som tar IEnumerable<T> (till exempel DataContractSerializer(Type, IEnumerable<Type>)).

Anmärkning

Till skillnad från andra primitiva typer DateTimeOffset är strukturen inte en känd typ som standard, så den måste läggas till manuellt i listan över kända typer (se Kända typer av datakontrakt).

Framåtkompatibilitet

DataContractSerializer förstår datakontrakt som har utformats för att vara kompatibla med framtida versioner av kontraktet. Sådana typer implementerar IExtensibleDataObject gränssnittet. Gränssnittet har egenskapen ExtensionData som returnerar ett ExtensionDataObject objekt. Mer information finns iForward-Compatible datakontrakt.

Kör med begränsat förtroende

När du instansierar målobjektet under deserialiseringen anropar DataContractSerializer inte konstruktorn för målobjektet. Om du redigerar en [DataContract] -typ som är tillgänglig från partiellt förtroende (dvs. den är offentlig och i en sammansättning som har AllowPartiallyTrustedCallers attributet tillämpat) och som utför vissa säkerhetsrelaterade åtgärder, måste du vara medveten om att konstruktorn inte anropas. I synnerhet fungerar inte följande tekniker:

  • Om du försöker begränsa partiell förtroendeåtkomst genom att göra konstruktorn intern eller privat, eller genom att lägga till en LinkDemand i konstruktorn – har ingen av dessa någon effekt under deserialisering under partiellt förtroende.
  • Om du kodar klassen som förutsätter att konstruktorn har körts kan klassen hamna i ett ogiltigt internt tillstånd som kan utnyttjas.