Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Introduzione alla serializzazione XML

La serializzazione è il processo di conversione di un oggetto in un formato che può essere agevolmente trasportato. Ad esempio, è possibile serializzare un oggetto e trasferirlo via Internet tramite protocollo HTTP tra un client e un server. Viceversa, la deserializzazione ricostruisce l'oggetto dal flusso.

La serializzazione XML serializza solo i campi pubblici e i valori di proprietà di un oggetto in un flusso XML. La serializzazione XML non include informazioni sul tipo. Se ad esempio si dispone di un oggetto Book che esiste nello spazio dei nomi Library, non c'è nessuna garanzia che venga deserializzato in un oggetto dello stesso tipo.

Nota Nota

La serializzazione XML non converte metodi, indicizzatori o proprietà in sola lettura (salvo le raccolte in sola lettura). Per serializzare tutti i campi e le proprietà di un oggetto, pubblici e privati, usare DataContractSerializer invece della serializzazione XML.

La classe centrale nella serializzazione XML è la classe XmlSerializer e i metodi più importanti in questa classe sono i metodi Serialize e Deserialize. La classe XmlSerializer crea file C# e li compila in file dll per eseguire tale serializzazione. In .NET Framework 2.0, Strumento per la generazione di serializzatori XML (Sgen.exe) è progettato per generare precedentemente tali assembly di serializzazione consentendone la distribuzione con l'applicazione e migliorando le prestazioni di avvio. Il flusso XML generato dalla classe XmlSerializer è conforme ai requisiti del World Wide Web Consortium (www.w3.org) relativi alla versione 1.0 di XSD (XML Schema Definition). Inoltre, i tipi di dati generati sono conformi al documento intitolato "XML Schema Part 2: Datatypes".

I dati negli oggetti sono descritti tramite costrutti del linguaggio di programmazione come classi, campi, proprietà, tipi primitivi, matrici, nonché XML incorporati sotto forma di oggetti XmlElement o XmlAttribute. È possibile creare le classi, annotate con attributi, o usare lo strumento XML Schema Definition per generare le classi basate su uno schema XML esistente.

Se si dispone di uno schema XML, è possibile eseguire lo strumento XML Schema Definition per generare un set di classi fortemente tipizzate rispetto allo schema e annotate con attributi. Quando viene serializzata un'istanza di tale classe, l'XML generato è conforme allo schema XML. Con l'utilizzo di tale classe, è possibile effettuare la programmazione rispetto a un modello a oggetti facilmente modificato essendo certi che l'XML generato sia conforme allo schema XML. Si tratta di un'alternativa all'utilizzo di altre classi in .NET Framework, ad esempio le classi XmlReader e XmlWriter, per analizzare e scrivere un flusso XML. Per altre informazioni, vedere Documenti e dati XML. Queste classi consentono di analizzare qualsiasi flusso XML. Viceversa, usare la classe XmlSerializer quando si prevede che il flusso XML sia conforme a uno schema XML noto.

Gli attributi controllano il flusso XML generato dalla classe XmlSerializer, consentendo di impostare lo spazio dei nomi XML, il nome dell'elemento, il nome di attributo e altri elementi del flusso XML. Per altre informazioni su tali attributi e sulle loro modalità di controllo della serializzazione XML, vedere Controllo della serializzazione XML mediante attributi. Per una tabella degli attributi usati per controllare l'XML generato, vedere Attributi per il controllo della serializzazione XML.

La classe XmlSerializer può serializzare ulteriormente un oggetto e può generare un flusso XML con codifica SOAP. L'elemento XML generato risulta conforme alla sezione 5 del documento "Simple Object Access Protocol (SOAP) 1.1" del World Wide Web Consortium. Per altre informazioni su questo processo, vedere Procedura: Serializzare un oggetto come flusso XML con codifica SOAP. Per una tabella degli attributi che controllano l'XML generato, vedere Attributi per il controllo della serializzazione SOAP codificata.

La classe XmlSerializer genera i messaggi SOAP creati dai e passati ai servizi Web XML. Per controllare i messaggi SOAP, è possibile applicare attributi alle classi, ai valori restituiti, ai parametri e ai campi trovati in un file del servizio Web XML (.asmx). È possibile usare entrambi gli attributi elencati in "Attributi per il controllo della serializzazione XML" e "Attributi per il controllo della serializzazione SOAP codificata", dal momento che un servizio Web XML può usare sia lo stile SOAP letterale che quello codificato. Per altre informazioni sull'utilizzo di tali attributi per il controllo dell'XML generato da un servizio Web XML, vedere Serializzazione XML con Servizi Web XML. Per altre informazioni su SOAP e sui servizi Web XML, vedere Customizing SOAP Messages.

Durante la creazione di un'applicazione che usa la classe XmlSerializer, tenere in considerazione i seguenti aspetti e le relative implicazioni:

  • La classe XmlSerializer crea file C# (.cs) e li compila in file dll nella directory denominata dalla variabile di ambiente TEMP; la serializzazione si verifica con tali file dll.

    Nota Nota

    Questi assembly di serializzazione possono essere generati in anticipo ed essere firmati tramite lo strumento SGen.exe. Tale funzione non è disponibile per i server di servizi Web. In altre parole, è disponibile solo per l'utilizzo client e per la serializzazione manuale.

    Il codice e le DLL sono vulnerabili a un processo dannoso al momento della creazione e della compilazione. Se si usa un computer su cui è in esecuzione Microsoft Windows NT 4.0 o versioni successive, è possibile che due o più utenti condividano la directory TEMP. La condivisione di una directory TEMP risulta pericolosa se i due account dispongono di privilegi di sicurezza diversi e se l'account con privilegi più elevati esegue un'applicazione usando XmlSerializer. In tal caso, un utente può compromettere la sicurezza del computer sostituendo il file cs o dll compilato. Per ovviare a questo problema, accertarsi sempre che ciascun account del computer disponga del proprio profilo. Per impostazione predefinita, la variabile di ambiente TEMP fa riferimento a una directory diversa per ciascun account.

  • Se un utente malintenzionato invia un flusso continuo di dati XML a un server Web (un attacco di tipo Denial of Service), XmlSerializer continua a elaborare i dati fino all'esaurimento delle risorse del computer.

    Questo tipo di attacco può essere impedito se si usa un computer su cui è in esecuzione Internet Information Services (IIS) e l'applicazione è in esecuzione all'interno di IIS. IIS dispone di un modulo di verifica che non elabora i flussi maggiori di una determinata dimensione (l'impostazione predefinita è 4 KB). Se si crea un'applicazione che non usa IIS e che esegue la deserializzazione con XmlSerializer, è necessario implementare una modulo di verifica simile che impedisca un attacco Denial of Service.

  • XmlSerializer serializza i dati ed esegue qualsiasi codice usando qualsiasi tipo fornito.

    Un oggetto non autorizzato può presentare una minaccia in due modi. L'oggetto può avere eseguito codice dannoso o può avere inserito codice dannoso nel file C# creato da XmlSerializer. Nel primo caso, se un oggetto non autorizzato tenta di eseguire una procedura distruttiva, la sicurezza di accesso al codice consente di impedire eventuali danni. Nel secondo caso, esiste una possibilità teorica che un oggetto non autorizzato possa inserire in qualche modo del codice nel file C# creato da XmlSerializer. Sebbene questo problema sia stato esaminato in modo approfondito e tale attacco è considerato improbabile, è necessario prendere la precauzione di non serializzare mai dati con un tipo ignoto e non attendibile.

  • I dati sensibili serializzati potrebbero essere vulnerabili.

    Successivamente alla serializzazione dei dati da parte di XmlSerializer, i dati possono essere archiviati come file XML o come altro archivio dati. Se l'archivio dati è disponibile per altri processi o è visibile su una Intranet o Internet, i dati possono essere rubati e usati in modo dannoso. Ad esempio, se si crea un'applicazione che serializza ordini che includono numeri di carta di credito, i dati risultano essere estremamente riservati. Per evitare ciò, proteggere sempre l'archivio per i dati ed eseguire le operazioni per mantenerli privati.

Nell'esempio di codice riportato di seguito viene mostrata una classe di base con un campo pubblico.

public class OrderForm
{
    public DateTime OrderDate;
}

Quando un'istanza di questa classe viene serializzata, potrebbe assomigliare agli elementi seguenti.

<OrderForm>
    <OrderDate>12/12/01</OrderDate>
</OrderForm>

Per ulteriori esempi di serializzazione, vedere Esempi di serializzazione XML.

I seguenti elementi possono essere serializzati usando la classe XmLSerializer:

  • Proprietà di lettura/scrittura pubbliche e campi di classi pubbliche.

  • Classi che implementano ICollection o IEnumerable.

    Nota Nota

    Vengono serializzate solo le raccolte e non le proprietà pubbliche.

  • Oggetti XmlElement.

  • Oggetti XmlNode.

  • Oggetti DataSet.

Per altre informazioni sulla serializzazione o deserializzazione degli oggetti, vedere Procedura: Serializzare un oggetto e Procedura: Deserializzare un oggetto.

La classe XmlSerializerfornisce il controllo completo e flessibile durante la serializzazione di un oggetto come XML. Se si sta creando un servizio Web XML, è possibile applicare attributi che controllano la serializzazione su classi e membri in modo da assicurare che l'output XML sia conforme a uno schema specifico.

Ad esempio, XmlSerializer consente di:

  • Specificare se un campo o una proprietà devono essere codificati come attributo o elemento.

  • Specificare un spazio dei nomi XML da usare.

  • Specificare il nome di un elemento o di un attributo se un nome di campo o proprietà non è appropriato.

Un altro vantaggio della serializzazione XML è che non si hanno vincoli sulle applicazioni in fase di sviluppo, finché il flusso XML generato sia conforme a uno schema specifico. Immaginare uno schema usato per descrivere libri. Lo schema riporta un elemento titolo, autore, editore autore e numero ISBN. È possibile sviluppare un'applicazione che elabori i dati XML in qualsiasi modo desiderato, ad esempio, come un ordine di libri o come inventario di libri. In entrambi i casi, l'unico requisito è che il flusso XML sia conforme allo schema XSD (XML Schema definition) specificato.

Di seguito sono riportati alcuni elementi da tenere in considerazione quando si usa la classe XmlSerializer:

  • Lo strumento Sgen.exe è progettato espressamente per generare assembly di serializzazione per prestazioni ottimali.

  • I dati serializzati contengono solo i dati stessi e la struttura delle classi. Le informazioni sull'identità e sull'assembly non sono incluse.

  • È possibile serializzare solo le proprietà e i campi pubblici. Le proprietà devono disporre di funzioni di accesso pubbliche (metodi get e set). Se è necessario serializzare dati non pubblici, usare la classe DataContractSerializer anziché la serializzazione XML.

  • Una classe deve disporre di un costruttore predefinito da serializzare tramite XmlSerializer.

  • I metodi non possono essere serializzati.

  • XmlSerializer può elaborare classi che implementano IEnumerable o ICollection in modo diverso, nel caso soddisfino determinati requisiti, come riportato di seguito.

    Una classe che implementa IEnumerable deve implementare un metodo Add pubblico che accetta un solo parametro. Il parametro del metodo Add deve essere coerente (polimorfico) con il tipo restituito dalla proprietà IEnumerator.Current restituita dal metodo GetEnumerator.

    Una classe che implementa ICollection oltre a IEnumerable (come CollectionBase) deve avere una proprietà indicizzata Item pubblica (un indexer in C#) che accetta un valore integer e deve disporre di una proprietà Count pubblica di tipo integer. Il parametro passato al metodo Add deve essere dello stesso tipo di quello restituito dalla proprietà Item o una delle basi di tale tipo.

    Per le classi che implementano ICollection, i valori da serializzare vengono recuperati dalla proprietà Item indicizzata piuttosto che dalla chiamata a GetEnumerator. Inoltre, proprietà e campi pubblici non vengono serializzati, fatta eccezione per i campi pubblici che restituiscono un'altra classe di raccolte (una che implementa ICollection). Per un esempio, vedere Esempi di serializzazione XML.

Il documento del World Wide Web Consortium (www.w3.org) intitolato "XML Schema Part 2: Datatypes" specifica i tipi di dati semplici consentiti in uno schema XSD (XML Schema Definition). Per molti di questi (ad esempio, int e decimal), esiste un tipo di dati corrispondente in .NET Framework. Tuttavia, alcuni tipi di dati XML non dispongono di un tipo di dati corrispondente in .NET Framework (ad esempio, il tipo di dati NMTOKEN). In tali casi, se si usa lo strumento XML Schema Definition (Strumento XML Schema Definition (Xsd.exe)) per generare classi da uno schema, viene applicato un attributo appropriato a un membro di tipo stringa e la relativa proprietà DataType viene impostata sul nome del tipo di dati XML. Ad esempio, se uno schema contiene un elemento denominato "MyToken" con il tipo di dati XML NMTOKEN, la classe generata potrebbe contenere un membro come illustrato nell'esempio riportato di seguito.

[XmlElement(DataType = "NMTOKEN")]
public string MyToken;

Analogamente, se si sta creando una classe che deve essere conforme a uno schema XML (XSD) specifico, è necessario applicare l'attributo appropriato e impostare la relativa proprietà DataType sul nome del tipo di dati XML desiderato.

Per un elenco completo dei mapping dei tipi, vedere la proprietà DataTypeper una delle seguenti classi di attributo:

  • [ T:System.Xml.Serialization.SoapAttributeAttribute ]

  • [ T:System.Xml.Serialization.SoapElementAttribute ]

  • [ T:System.Xml.Serialization.XmlArrayItemAttribute ]

  • [ T:System.Xml.Serialization.XmlAttributeAttribute ]

  • [ T:System.Xml.Serialization.XmlElementAttribute ]

  • [ T:System.Xml.Serialization.XmlRootAttribute ]

Aggiunte alla community

Mostra: