Tipi supportati dal serializzatore dei contratti dati

Windows Communication Foundation (WCF) utilizza 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 ulteriori informazioni, vedere Utilizzo di contratti dati e Tipi serializzabili.

  • Tipi di insieme. Questi sono i tipi che rappresentano elenchi di dati. Possono essere matrici normali di tipi, o tipi di insieme, ad esempio ArrayList e Dictionary. L'attributo CollectionDataContractAttribute può essere utilizzato per personalizzare la serializzazione di questi tipi, ma non è obbligatorio. Per ulteriori informazioni, vedere Tipi di insiemi nei contratti 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 ulteriori informazioni, vedere Tipi di enumerazioni nei contratti dati.

  • Tipi primitivi .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, Object e 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, XmlQualifiedName e matrici di Byte.

    Nota

    Contrariamente ad altri tipi primitivi, DateTimeOffset non è un tipo conosciuto per impostazione predefinita. Per ulteriori informazioni, vedere Tipi conosciuti di contratto dati).

  • Tipi contrassegnati con l'attributo SerializableAttribute. Numerosi tipi inclusi nella libreria della classe di base .NET Framework rientrano in questa categoria. DataContractSerializer supporta completamente questo modello di programmazione della serializzazione utilizzato da .NET Framework Remoting, BinaryFormatter e 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. Il tipo ADO.NET DataTable e il tipo DataSet (come le sue classi derivate tipizzate) implementano tutti l'interfaccia IXmlSerializable e rientrano pertanto in questa categoria. Per ulteriori informazioni, vedere Tipi XML e ADO.NET nei contratti 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à Attendibilità parziale, la serializzazione e deserializzazione dei campi readonly (sia public che private) 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 parzialmente attendibile. 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 campi readonly non sono supportate quando WCF viene eseguito in un'applicazione parzialmente attendibile.
    • Il modello di programmazione [Serializable]/ISerializable] non è supportato in un ambiente parzialmente attendibile.
    • I tipi conosciuti devono essere specificati nel codice o nella configurazione a livello di computer (Machine.config). I tipi conosciuti 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 protezione [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 nullable sono totalmente supportati dal serializzatore dei contratti dati
  • I tipi di interfaccia vengono trattati come Object o, nel caso di interfacce di insieme, come tipi di insieme.
  • Sono supportate sia le strutture che le classi.
  • DataContractSerializer non supporta il modello di programmazione utilizzato 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 WCF deve essere impostato per utilizzare 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 che DBNull è un tipo serializzabile, richiede l'autorizzazione SerializationFormatter.

Vedere anche

Concetti

Tipi XML e ADO.NET nei contratti dati
Utilizzo di contratti dati
Tipi serializzabili
Tipi di insiemi nei contratti dati
Tipi di enumerazioni nei contratti dati