Types Supported by the Data Contract Serializer
Windows Communication Foundation usa DataContractSerializer come motore di serializzazione predefinito per convertire i dati in XML e convertire di nuovo XML in dati. DataContractSerializer è progettato per serializzare tipi di contratto dati . Supporta tuttavia molti altri tipi che possono essere considerati come tipi dotati di un contratto dati implicito. Nell'elenco seguente sono riportati tutti i tipi serializzabili:
Tutti i tipi visibili pubblicamente con un costruttore che non dispone di parametri.
Tipi di contratto dati. Questi sono i tipi ai quali è stato applicato l'attributo DataContractAttribute . I nuovi tipi personalizzati che rappresentano oggetti business devono in genere essere creati come tipi di contratto dati. Per altre informazioni, vedere Uso dei contratti di dati e Tipi serializzabili.
Tipi di raccolta. Questi sono i tipi che rappresentano elenchi di dati. Possono essere matrici normali di tipi, o tipi di raccolta, ad esempio ArrayList e Dictionary<TKey,TValue>. L'attributo CollectionDataContractAttribute può essere utilizzato per personalizzare la serializzazione di questi tipi, ma non è obbligatorio. Per altre informazioni, vedere Tipi di raccolta nei contratti di dati.
Tipi di enumerazione. Le enumerazioni, incluse quelle di flag, sono serializzabili. Facoltativamente, i tipi di enumerazione possono essere contrassegnati con l'attributo DataContractAttribute , nel qual caso ogni membro che partecipa alla serializzazione deve essere contrassegnato con l'attributo EnumMemberAttribute . I membri non contrassegnati non vengono serializzati. Per altre informazioni, vedere Tipi di enumerazione nei contratti di dati.
Tipi primitivi di .NET Framework. I tipi seguenti incorporati in .NET Framework possono essere tutti serializzati e sono considerati tipi primitivi: Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Boolean, Char, Decimal, Objecte String.
Altri tipi primitivi. Questi tipi non sono primitivi in .NET Framework, ma sono trattati come primitivi nel formato XML serializzato. Questi tipi sono DateTime, DateTimeOffset, TimeSpan, Guid, Uri, XmlQualifiedNamee matrici di Byte.
Nota
Contrariamente ad altri tipi primitivi, DateTimeOffset non è un tipo conosciuto per impostazione predefinita. Per altre informazioni, vedere Tipi noti del contratto di dati).
Tipi contrassegnati con l'attributo SerializableAttribute . Molti tipi inclusi nella libreria di classi di base di .NET Framework rientrano in questa categoria. DataContractSerializer supporta completamente questo modello di programmazione della serializzazione utilizzato da .NET Framework Remoting, BinaryFormattere SoapFormatter, compreso il supporto per l'interfaccia ISerializable .
Tipi che rappresentano XML non elaborato o tipi che rappresentano dati relazionali ADO.NET. XmlElement e la matrice di tipi XmlNode sono supportati come un modo di rappresentazione diretta di XML. Sono inoltre supportati i tipi che implementano l'interfaccia IXmlSerializable , compreso l'attributo XmlSchemaProviderAttribute correlato e i tipi XDocument e XElement . L'attributo ADO.NETDataTable e il tipo DataSet (come le sue classi derivate tipizzate) implementano tutti l'interfaccia IXmlSerializable e di conseguenza appartengono a questa categoria. Per altre informazioni, vedere Tipi XML e ADO.NET nei contratti di dati.
Limitazioni dell'utilizzo di certi tipi in modalità parzialmente attendibile
Nell'elenco seguente sono riportate le limitazioni relative all'utilizzo di determinati tipi in scenari in modalità parzialmente attendibile:
Per serializzare o deserializzare un tipo che implementa ISerializable in codice parzialmente attendibile tramite DataContractSerializer è necessario disporre delle autorizzazioni SerializationFormatter e UnmanagedCode .
Quando si esegue codice WCF in modalità Partial Trust, la serializzazione e la deserializzazione dei campi
readonly
(public
eprivate
) non sono supportate. Ciò è dovuto al fatto che IL generato non è verificabile e pertanto richiede autorizzazioni elevate.Entrambe le classi DataContractSerializer e XmlSerializer sono supportate in un ambiente di trust parziale. Tuttavia, l'utilizzo di DataContractSerializer è soggetto alle condizioni seguenti:
Tutti i tipi
[DataContract]
serializzabili devono essere pubblici.Tutti i campi
[DataMember]
o le proprietà in un tipo[DataContract]
devono essere pubblici e di lettura/scrittura. La serializzazione e la deserializzazione di campireadonly
non sono supportate quando WCF viene eseguito in un'applicazione parzialmente attendibile.L'attributo
[Serializable]
/ISerializable]
non è supportato in un ambiente parzialmente attendibile.I tipi noti devono essere specificati nel codice o nella configurazione a livello di computer (
Machine.config
). I tipi noti non possono essere specificati nella configurazione a livello di applicazione per motivi di sicurezza.
I tipi che implementano IObjectReference generano un'eccezione in un ambiente parzialmente attendibile, poiché il metodo GetRealObject richiede l'autorizzazione di sicurezza
[SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
.
Note aggiuntive sulla serializzazione
Le regole seguenti si applicano anche ai tipi supportati dal serializzatore di contratti dati:
I tipi generici sono totalmente supportati dal serializzatore dei contratti dati
I tipi di valori nullable sono totalmente supportati dal serializzatore dei contratti dati.
I tipi di interfaccia vengono trattati come Object o, nel caso di interfacce di raccolta, come tipi di raccolta.
Sono supportate sia le strutture che le classi.
DataContractSerializer non supporta il modello di programmazione usato dai servizi Web XmlSerializer e ASP.NET. In particolare, non supporta attributi quali XmlElementAttribute e XmlAttributeAttribute. Per abilitare il supporto per questo modello di programmazione, è necessario passare a WCF per usare XmlSerializer anziché DataContractSerializer.
Il tipo DBNull viene trattato in modo speciale. È un tipo singleton e sulla deserializzazione il deserializzatore rispetta il vincolo singleton e punta tutti i riferimenti
DBNull
all'istanza singleton. Dato cheDBNull
è un tipo serializzabile, richiede l'autorizzazione SerializationFormatter .