Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.
Utilizzare la DataContractSerializer classe per serializzare e deserializzare le istanze di un tipo in un flusso o in un 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 Person classe e scrivere tutti i relativi valori di proprietà in un documento XML per il recupero successivo o in un flusso XML per il trasporto immediato. La cosa più importante, viene usato DataContractSerializer 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 della classe per specificare proprietà e campi serializzati.
Per un elenco di tipi che possono essere serializzati, vedere Tipi supportati dal serializzatore del contratto dati.
Per utilizzare il DataContractSerializer, creare prima un'istanza di una classe e un oggetto appropriato per scrivere o leggere il formato, ad esempio un'istanza del XmlDictionaryWriter. Chiamare quindi il WriteObject metodo per rendere persistenti i dati. Per recuperare i dati, creare un oggetto appropriato per leggere il formato di dati , ad esempio un XmlDictionaryReader oggetto per un documento XML, e chiamare il ReadObject metodo .
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
DataContractSerializer viene utilizzato in combinazione con le classi DataContractAttribute e DataMemberAttribute. Per preparare una classe per la serializzazione, applicare il DataContractAttribute alla classe. Per ogni membro della classe che restituisce i dati da serializzare, applicare il DataMemberAttribute. È possibile serializzare campi e proprietà, indipendentemente dall'accessibilità: privato, protetto, interno, protetto interno o pubblico.
Ad esempio, lo schema specifica un oggetto con una CustomerID proprietà , ma è già disponibile un'applicazione esistente che usa un tipo denominato Person con una Name proprietà . Per creare un tipo conforme al contratto, applicare prima l'oggetto DataContractAttribute alla classe . Quindi, applica DataMemberAttribute a ogni campo o proprietà che si desidera serializzare.
Annotazioni
È possibile applicare il DataMemberAttribute a membri sia privati che pubblici.
Il formato finale del codice XML non deve essere testo. Scrive invece DataContractSerializer i dati come infoset XML, che consente di scrivere i dati in qualsiasi formato riconosciuto da XmlReader e XmlWriter. È consigliabile usare le XmlDictionaryReader classi e XmlDictionaryWriter per leggere e scrivere, perché entrambe sono ottimizzate per l'uso con .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 Version-Tolerant Callback di serializzazione.
Aggiungere alla raccolta di tipi noti
Durante la serializzazione o la deserializzazione di un oggetto, è necessario che il tipo sia "noto" a DataContractSerializer. Iniziare creando un'istanza di una classe che implementa IEnumerable<T> (ad esempio List<T>) e aggiungendo i tipi noti alla raccolta. Quindi, crea un'istanza di DataContractSerializer usando uno degli overload che accettano IEnumerable<T>, ad esempio DataContractSerializer(Type, IEnumerable<Type>).
Annotazioni
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à futura
DataContractSerializer Comprende i contratti dati progettati per essere compatibili con le versioni future del contratto. Tali tipi implementano l'interfaccia IExtensibleDataObject . L'interfaccia include la ExtensionData proprietà che restituisce un ExtensionDataObject oggetto . Per altre informazioni, vedere Forward-Compatible Contratti dati.
Esecuzione con attendibilità parziale
Quando si crea un'istanza dell'oggetto di destinazione durante la deserializzazione, il 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, le tecniche seguenti non funzionano:
- Se si tenta di limitare l'accesso parzialmente attendibile rendendo il costruttore interno o privato o aggiungendo un
LinkDemandal costruttore, nessuno di questi ha alcun effetto durante la deserializzazione con attendibilità parziale. - Se si codifica la classe che presuppone che il costruttore sia stato eseguito, la classe potrebbe entrare in uno stato interno non valido che è sfruttabile.