Condividi tramite


Classe System.Runtime.Serialization.DataContractSerializer

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Utilizzare la classe DataContractSerializer per serializzare e deserializzare le istanze di un tipo in un flusso o documento XML. Ad esempio, è possibile creare un tipo denominato Person con proprietà che contengono dati essenziali, ad esempio un nome e un indirizzo. È quindi possibile creare e modificare un'istanza della classe Person e scrivere tutti i valori delle relative proprietà in un documento XML per il recupero in un momento successivo o in un flusso XML per il trasporto immediato. Più importante, viene DataContractSerializer usato per serializzare e deserializzare i dati inviati nei messaggi di Windows Communication Foundation (WCF). Applicare l'attributo DataContractAttribute alle classi e l'attributo DataMemberAttribute ai membri delle classi per specificare le proprietà e i campi serializzati.

Per un elenco di tipi che possono essere serializzati, vedere Tipi supportati dal serializzatore del contratto dati.

Per utilizzare la classe DataContractSerializer, creare innanzitutto un'istanza di una classe e un oggetto appropriato per la scrittura o la lettura del formato; ad esempio, un'istanza della classe XmlDictionaryWriter. Chiamare quindi il metodo WriteObject per impostare i dati come persistenti. Per recuperare i dati, creare un oggetto appropriato per la lettura del formato dati (ad esempio una classe XmlDictionaryReader per un documento XML) e chiamare il metodo ReadObject.

Per altre informazioni sull'uso di DataContractSerializer, vedere Serializzazione e deserializzazione.

È possibile impostare il tipo di serializzatore di un contratto dati usando l'elemento <dataContractSerializer> in un file di configurazione dell'applicazione client.

Preparare le classi per la serializzazione o la deserializzazione

La classe DataContractSerializer viene utilizzata insieme alle classi DataContractAttribute e DataMemberAttribute. Per preparare una classe per la serializzazione, applicare l'attributo DataContractAttribute alla classe. Per ogni membro della classe che restituisce dati che si desidera serializzare, applicare l'attributo DataMemberAttribute. È possibile serializzare campi e proprietà indipendentemente dall'accessibilità: privata, protetta, interna, protetta interna o pubblica.

Ad esempio, lo schema specifica un tipo Customer con una proprietà ID, ma esiste già un'applicazione che utilizza un tipo denominato Person con una proprietà Name. Per creare un tipo conforme al contratto, applicare innanzitutto l'attributo DataContractAttribute alla classe. Applicare quindi l'attributo DataMemberAttribute a ogni campo o proprietà che si desidera serializzare.

Nota

È possibile applicare DataMemberAttribute a membri privati e pubblici.

Il formato finale dell'XML non deve necessariamente essere testo. La classe DataContractSerializer scrive i dati come infoset XML, che consente la scrittura dei dati in qualsiasi formato riconosciuto dalle classi XmlReader e XmlWriter. È consigliabile utilizzare le classi XmlDictionaryReader e XmlDictionaryWriter per leggere e scrivere, poiché entrambe sono ottimizzate per l'utilizzo con la classe DataContractSerializer.

Se si crea una classe con campi o proprietà che devono essere popolati prima che si verifichi la serializzazione o la deserializzazione, usare gli attributi di callback, come descritto in Callback di serializzazione a tolleranza di versione.

Aggiungere alla raccolta di tipi noti

Durante la serializzazione o deserializzazione di un oggetto, è necessario che il tipo sia "conosciuto" dalla classe DataContractSerializer. Creare innanzitutto un'istanza di una classe che implementa l'interfaccia IEnumerable<T> (ad esempio la classe List<T>) e aggiungere i tipi conosciuti alla raccolta. Creare quindi un'istanza DataContractSerializer di usando uno degli overload che accetta IEnumerable<T> , ad esempio DataContractSerializer(Type, IEnumerable<Type>).

Nota

A differenza di altri tipi primitivi, la DateTimeOffset struttura non è un tipo noto per impostazione predefinita, quindi deve essere aggiunta manualmente all'elenco dei tipi noti (vedere Tipi noti del contratto dati).

Compatibilità con le versioni successive

La classe DataContractSerializer comprende contratti dati progettati per essere compatibili con versioni future del contratto. Tali tipi implementano l'interfaccia IExtensibleDataObject. L'interfaccia comprende la proprietà ExtensionData che restituisce un oggetto ExtensionDataObject. Per altre informazioni, vedere Contratti di dati compatibili con versioni successive.

Esecuzione con attendibilità parziale

Quando si crea un'istanza dell'oggetto di destinazione durante la deserializzazione, la classe DataContractSerializer non chiama il costruttore dell'oggetto di destinazione. Se si crea un tipo [DataContract] accessibile da attendibilità parziale( ovvero è pubblico e in un assembly con l'attributo AllowPartiallyTrustedCallers applicato) e che esegue alcune azioni correlate alla sicurezza, è necessario tenere presente che il costruttore non viene chiamato. In particolare, non è possibile utilizzare le tecniche seguenti:

  • Se si tenta di limitare l'accesso parzialmente attendibile rendendo interno o privato il costruttore o aggiungendo un LinkDemand al costruttore, nessuno dei due elementi eserciterà alcun effetto durante la deserializzazione con attendibilità parziale.
  • Se si codifica la classe che presuppone che il costruttore sia stato eseguito, si può portare la classe in uno stato interno non valido vulnerabile.