Share via


Utilizzo della classe XmlSerializer

Windows Communication Foundation (WCF) può utilizzare due diverse tecnologie di serializzazione per trasformare i dati dell'applicazione in XML trasmesso tra client e servizi, un processo definito serializzazione.

DataContractSerializer come impostazione predefinita

Per impostazione predefinita, WCF utilizza la classe DataContractSerializer per serializzare i tipi di dati. Questo serializzatore supporta i tipi seguenti:

  • Tipi primitivi (ad esempio, numeri interi, stringhe e matrici di byte), nonché alcuni tipi speciali, ad esempio XmlElement e DateTime, che vengono trattati come primitivi.
  • Tipi di contratti dati (tipi contrassegnati con l'attributo DataContractAttribute).
  • Tipi contrassegnati con l'attributo SerializableAttribute, inclusi i tipi che implementano l'interfaccia ISerializable.
  • Tipi che implementano l'interfaccia IXmlSerializable.
  • Molti tipi di insieme comuni, inclusi molti tipi di insieme generici.

Molti tipi .NET Framework rientrano in una delle ultime due categorie e pertanto sono serializzabili. Anche le matrici di tipi serializzabili sono serializzabili. Per un elenco completo, vedere Specifica del trasferimento di dati nei contratti di servizio.

DataContractSerializer, utilizzato con i tipi di contratto dati, rappresenta il modo consigliato per scrivere nuovi servizi WCF. Per ulteriori informazioni, vedere Utilizzo di contratti dati.

Quando utilizzare la classe XmlSerializer

WCF supporta anche la classe XmlSerializer. La classe XmlSerializer non è univoca per WCF. È lo stesso motore di serializzazione utilizzato dai servizi Web ASP.NET. La classe XmlSerializer supporta un insieme di tipi molto più ristretto rispetto alla classe DataContractSerializer, ma garantisce un controllo maggiore sul contenuto XML risultante e un supporto maggiore dello standard XSD (XML Schema Definition Language). Inoltre, non richiede attributi dichiarativi sui tipi serializzabili. Per ulteriori informazioni, vedere l'argomento relativo alla serializzazione XML nella documentazione di .NET Framework. La classe XmlSerializer non supporta i tipi di contratto dati.

Se si utilizza Svcutil.exe o la funzionalità Aggiungi riferimento al servizio in Visual Studio per generare codice client per un servizio di terze parti o per accedere a un schema di terze parti, viene selezionato automaticamente un serializzatore appropriato. Se lo schema non è compatibile con DataContractSerializer, viene selezionato XmlSerializer.

Passaggio manuale a XmlSerializer

In alcuni casi può essere necessario passare manualmente a XmlSerializer. Ciò si verifica, ad esempio, nei casi seguenti:

  • Quando si esegue la migrazione di un'applicazione dai servizi Web ASP.NET a WCF, può essere necessario riutilizzare i tipi compatibili con XmlSerializer esistenti anziché creare nuovi tipi di contratto dati.
  • Se è importante controllare in modo accurato il contenuto XML presente nei messaggi ma non è disponibile un documento WSDL (Web Services Description Language), ad esempio, quando si crea un servizio con tipi che devono conformarsi a uno specifico schema standardizzato pubblicato che non è compatibile con DataContractSerializer.
  • Quando si creano servizi che seguono lo standard della codifica SOAP legacy.

In questi e altri casi è possibile passare manualmente alla classe XmlSerializer applicando l'attributo XmlSerializerFormatAttribute al servizio, come illustrato nel codice seguente.

Considerazioni sulla protezione

Nota

È importante fare attenzione quando si passa ai motori di serializzazione. Lo stesso tipo può essere serializzato in XML in modo diverso a seconda del serializzatore utilizzato. Se si utilizza accidentalmente il serializzatore sbagliato, potrebbero essere diffuse informazioni dal tipo che non si aveva intenzione di diffondere.

Ad esempio, la classe DataContractSerializer serializza solo membri contrassegnati con l'attributo DataMemberAttribute quando si serializzano tipi di contratto dati. La classe XmlSerializer serializza qualsiasi membro pubblico. Vedere il tipo nel codice seguente.

Se il tipo viene utilizzato inavvertitamente in un contratto di servizio in cui è selezionata la classe XmlSerializer, il membro creditCardNumber viene serializzato, operazione probabilmente non voluta.

Anche se la classe DataContractSerializer è l'impostazione predefinita, è possibile selezionarla in modo esplicito per il servizio (anche se questa operazione non è richiesta) applicando l'attributo DataContractFormatAttribute al tipo di contratto di servizio.

Il serializzatore utilizzato per il servizio è parte integrante del contratto e non può essere modificato selezionando un'associazione diversa o modificando le altre impostazioni di configurazione.

Altre importanti considerazioni di protezione riguardano la classe XmlSerializer. È innanzitutto consigliabile firmare qualsiasi applicazione WCF che utilizza la classe XmlSerializer con una chiave a cui sia applicata una misura di protezione che impedisca la diffusione di informazioni. Questa indicazione è valida sia quando si esegue un passaggio manuale a XmlSerializer che quando si esegue un passaggio automatico (mediante Svcutil.exe, Aggiungi riferimento al servizio o uno strumento simile). Ciò è necessario in quanto il motore di serializzazione XmlSerializer supporta il caricamento di assembly di serializzazione pregenerati purché siano firmati con la stessa chiave dell'applicazione. Un'applicazione non firmata è priva di qualsiasi protezione rispetto alla possibilità che un assembly dannoso corrispondente al nome previsto dell'assembly di serializzazione pregenerato venga posizionato nella cartella dell'applicazione o nella Global Assembly Cache. L'autore di un attacco dovrà comunque ottenere l'accesso in scrittura a uno di questi due percorsi prima di tentare questa azione.

Un'altra minaccia che esiste quando si utilizza XmlSerializer riguarda l'accesso in scrittura alla cartella temporanea del sistema. Il motore di serializzazione XmlSerializer crea e utilizza assembly di serializzazione temporanei in questa cartella. È quindi necessario tenere presente che qualsiasi processo con accesso in scrittura alla cartella temporanea può sovrascrivere questi assembly di serializzazione con codice dannoso.

Regole per il supporto di XmlSerializer

Non è possibile applicare direttamente attributi compatibili con XmlSerializer ai parametri o ai valori restituiti dell'operazione del contratto. Tali attributi possono tuttavia essere applicati ai messaggi tipizzati (parti del corpo del contratto di messaggio), come illustrato nel codice seguente.

Se applicati ai membri del messaggio tipizzato, questi attributi eseguono l'override delle proprietà in conflitto negli attributi del messaggio tipizzato. Ad esempio, nel codice seguente ElementName esegue l'override di Name.

L'attributo MessageHeaderArrayAttribute non è supportato quando si utilizza XmlSerializer.

Nota

In questo caso, XmlSerializer genera la seguente eccezione, rilasciata prima di WCF: "Un elemento dichiarato al livello principale di uno schema non può avere l'attributo maxOccurs 1 >. Fornire un elemento wrapper per "more" utilizzando XmlArray o XmlArrayItem anziché XmlElementAttribute, oppure utilizzando lo stile di parametro Wrapped".

Se si riceve tale eccezione, verificare se questa situazione è applicabile.

WCF non supporta gli attributi SoapIncludeAttribute e XmlIncludeAttribute nei contratti di messaggio e di operazione, pertanto è necessario utilizzare l'attributo KnownTypeAttribute.

Vedere anche

Attività

Procedura: migliorare il tempo di avvio di applicazioni client WCF utilizzando XmlSerializer

Riferimenti

DataContractFormatAttribute
DataContractSerializer
XmlSerializer
MessageHeaderArrayAttribute

Concetti

Specifica del trasferimento di dati nei contratti di servizio
Utilizzo di contratti dati