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 DataContractSerializer är att 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 . Om du vill förbereda en klass för serialisering använder du för DataContractAttribute klassen. För varje medlem i klassen som returnerar data som du vill serialisera använder DataMemberAttributedu . 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. Om du vill skapa en typ som överensstämmer med kontraktet tillämpar du först på DataContractAttribute klassen. Använd sedan för DataMemberAttribute varje fält eller egenskap som du vill serialisera.
Kommentar
Du kan använda för DataMemberAttribute både privata och offentliga medlemmar.
Det slutliga formatet för XML-koden behöver inte vara text. DataContractSerializer I stället skriver data som en XML-informationsuppsättning, vilket gör att du kan skriva data till alla format som identifieras 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 fyllas i innan serialiseringen eller deserialiseringen inträffar använder du motringningsattribut enligt beskrivningen i Versionstoleranta 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 med hjälp av DataContractSerializer en av de överlagringar som tar IEnumerable<T> (till exempel DataContractSerializer(Type, IEnumerable<Type>)).
Kommentar
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).
Vidarebefordra kompatibilitet
Förstå DataContractSerializer 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 i Framåtkompatibla datakontrakt.
Kör under partiellt 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.