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.
La serializzazione è il processo di conversione di un oggetto in un modulo che può essere facilmente trasportato. Ad esempio, è possibile serializzare un oggetto e trasferirlo su Internet usando HTTP tra un client e un server. D'altro canto, la deserializzazione ricostruisce l'oggetto dal flusso.
La serializzazione XML serializza solo i campi pubblici e i valori delle proprietà di un oggetto in un flusso XML. La serializzazione XML non include informazioni sul tipo. Ad esempio, se si dispone di un oggetto Book presente nello spazio dei nomi Library , non esiste alcuna garanzia che venga deserializzato in un oggetto dello stesso tipo.
Annotazioni
La serializzazione XML non converte metodi, indicizzatori, campi privati o proprietà di sola lettura (ad eccezione delle raccolte di sola lettura). Per serializzare tutti i campi e le proprietà di un oggetto, sia pubblici che privati, utilizzare DataContractSerializer invece della serializzazione XML.
La classe centrale nella serializzazione XML è la XmlSerializer classe e i metodi più importanti di questa classe sono i metodi Serialize e Deserialize . XmlSerializer Crea i file C# e li compila in .dll file per eseguire questa serializzazione. Lo strumento generatore di serializzatori XML (Sgen.exe) è progettato per generare in anticipo questi assembly di serializzazione da distribuire con l'applicazione e migliorare le prestazioni di avvio. Il flusso XML generato da XmlSerializer è conforme alla raccomandazione W3C (XML Schema Definition Language) 1.0 del World Wide Web Consortium (W3C). Inoltre, i tipi di dati generati sono conformi al documento intitolato "XML Schema Part 2: Datatypes".
I dati negli oggetti vengono descritti usando costrutti del linguaggio di programmazione come classi, campi, proprietà, tipi primitivi, matrici e anche XML incorporati sotto forma di oggetti XmlElement o XmlAttribute . È possibile creare classi personalizzate, annotare con attributi o usare lo strumento XML Schema Definition per generare le classi in base a uno schema XML esistente.
Se si dispone di un XML Schema, è possibile eseguire lo strumento XML Schema Definition per produrre un set di classi fortemente tiptate per lo schema e annotate con attributi. Quando un'istanza di tale classe viene serializzata, il codice XML generato è conforme all'XML Schema. Fornito con una classe di questo tipo, è possibile programmare in base a un modello a oggetti facilmente manipolato assicurandosi che il codice XML generato sia conforme allo schema XML. Si tratta di un'alternativa all'uso di altre classi in .NET, 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. Al contrario, usare XmlSerializer quando si prevede che il flusso XML sia conforme a un XML Schema 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 dell'attributo e così via, del flusso XML. Per altre informazioni su questi attributi e su come controllano la serializzazione XML, vedere Controllo della serializzazione XML tramite attributi. Per una tabella di tali attributi utilizzati per controllare il codice XML generato, vedere Attributi che controllano la serializzazione XML.
La classe XmlSerializer può serializzare ulteriormente un oggetto e generare un flusso XML SOAP codificato. Il codice XML generato è conforme alla sezione 5 del documento World Wide Web Consortium intitolato "Simple Object Access Protocol (SOAP) 1.1". Per altre informazioni su questo processo, vedere Procedura: Serializzare un oggetto come flusso XML SOAP-Encoded. Per una tabella degli attributi che controllano il codice XML generato, vedere Attributi che controllano la serializzazione SOAP codificata.
La classe XmlSerializer genera i messaggi SOAP creati da 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 di servizio Web XML (con estensione asmx). È possibile utilizzare entrambi gli attributi elencati in "Attributi che controllano la serializzazione XML" e "Attributi che controllano la serializzazione SOAP codificata" perché un servizio Web XML può utilizzare lo stile SOAP codificato o letterale. Per altre informazioni sull'utilizzo degli attributi per controllare il codice XML generato da un servizio Web XML, vedere Serializzazione XML con servizi Web XML. Per altre informazioni sui servizi Web SOAP e XML, vedere Personalizzazione della formattazione dei messaggi SOAP.
Considerazioni sulla sicurezza per le applicazioni XmlSerializer
Quando si crea un'applicazione che usa XmlSerializer, tenere presenti gli elementi seguenti e le relative implicazioni:
XmlSerializer crea file C# (.cs) e li compila in file .dll nella directory denominata dalla variabile di ambiente TEMP; la serializzazione avviene con tali DLL.
Annotazioni
Questi assembly di serializzazione possono essere generati in anticipo e firmati usando lo strumento SGen.exe. Non funziona in un server di servizi Web. In altre parole, è solo per l'uso da parte del cliente e per la serializzazione manuale.
Il codice e le DLL sono vulnerabili a un processo dannoso al momento della creazione e della compilazione. Potrebbe essere possibile che due o più utenti condividano la directory TEMP. La condivisione di una directory TEMP è pericolosa se i due account hanno privilegi di sicurezza diversi e l'account con privilegi più elevati esegue un'applicazione usando XmlSerializer. In questo caso, un utente può violare la sicurezza del computer sostituendo il .cs o .dll file compilato. Per eliminare questo problema, assicurarsi sempre che ogni account nel computer abbia un proprio profilo. Per impostazione predefinita, la variabile di ambiente TEMP punta a una directory diversa per ogni account.
Se un utente malintenzionato invia un flusso continuo di dati XML a un server Web (un attacco Denial of Service), XmlSerializer continua a elaborare i dati fino a quando il computer non viene ridotto sulle risorse.
Questo tipo di attacco viene eliminato se si usa un computer che esegue Internet Information Services (IIS) e l'applicazione è in esecuzione in IIS. IIS dispone di un gate che non elabora flussi più lunghi di un valore impostato (il valore predefinito è 4 KB). Se si crea un'applicazione che non usa IIS e deserializza con XmlSerializer, è necessario implementare un controllo simile che impedisce un attacco di negazione del servizio.
XmlSerializer serializza i dati ed esegue qualsiasi codice usando qualsiasi tipo specificato.
Esistono due modi in cui un oggetto dannoso presenta una minaccia. Potrebbe eseguire codice dannoso o inserire codice dannoso nel file C# creato da XmlSerializer. Nel secondo caso, esiste una possibilità teorica che un oggetto dannoso possa in qualche modo inserire codice nel file C# creato da XmlSerializer. Anche se questo problema è stato esaminato accuratamente e tale attacco è considerato improbabile, è consigliabile prendere la precauzione di non serializzare mai i dati con un tipo sconosciuto e non attendibile.
I dati sensibili serializzati potrebbero essere vulnerabili.
Dopo che XmlSerializer ha serializzato i dati, è possibile archiviarli come file XML o in un altro archivio dati. Se l'archivio dati è disponibile per altri processi o è visibile in una intranet o in Internet, i dati possono essere rubati e usati in modo dannoso. Ad esempio, se si crea un'applicazione che serializza gli ordini che includono numeri di carta di credito, i dati sono altamente sensibili. Per evitare questo problema, proteggere sempre l'archivio per i dati e adottare misure per mantenerlo privato.
Serializzazione di una classe semplice
Nell'esempio di codice seguente viene illustrata una classe di base con un campo pubblico.
Public Class OrderForm
Public OrderDate As DateTime
End Class
public class OrderForm
{
public DateTime OrderDate;
}
Quando un'istanza di questa classe viene serializzata, potrebbe essere simile alla seguente.
<OrderForm>
<OrderDate>12/12/01</OrderDate>
</OrderForm>
Per altri esempi di serializzazione, vedere Esempi di serializzazione XML.
Elementi che possono essere serializzati
È possibile serializzare gli elementi seguenti usando la classe XmlSerializer :
Proprietà pubbliche di lettura/scrittura e campi delle classi pubbliche.
Classi che implementano ICollection o IEnumerable.
Annotazioni
Solo le raccolte vengono serializzate, non le proprietà pubbliche.
Oggetti di tipo XmlElement.
Oggetti XmlNode .
Oggetti DataSet.
Per altre informazioni sulla serializzazione o la deserializzazione di oggetti, vedere Procedura: Serializzare un oggetto e Procedura: Deserializzare un oggetto.
Vantaggi dell'uso della serializzazione XML
La classe XmlSerializer offre un controllo completo e flessibile quando si serializza un oggetto come XML. Se si crea un servizio Web XML, è possibile applicare attributi che controllano la serializzazione a classi e membri per garantire 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 uno spazio dei nomi XML da utilizzare.
Specificare il nome di un elemento o di un attributo se un campo o un nome di proprietà non è appropriato.
Un altro vantaggio della serializzazione XML è che non si hanno vincoli sulle applicazioni sviluppate, purché il flusso XML generato sia conforme a uno schema specifico. Si immagini uno schema usato per descrivere i libri. Include un titolo, un autore, un editore e un elemento di numero ISBN. È possibile sviluppare un'applicazione che elabora i dati XML in qualsiasi modo desiderato, ad esempio come ordine di libro o come inventario di libri. In entrambi i casi, l'unico requisito è che il flusso XML sia conforme allo schema XSD (XML Schema Definition Language) specificato.
Considerazioni sulla serializzazione XML
Quando si usa la classe XmlSerializer , è necessario considerare quanto segue:
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à del tipo e sull'assembly non sono incluse.
Solo le proprietà e i campi pubblici possono essere serializzati. Le proprietà devono avere funzioni di accesso pubbliche (metodi get e set). Se è necessario serializzare dati non pubblici, utilizzare la classe DataContractSerializer anziché la serializzazione XML.
Una classe deve avere un costruttore senza parametri da serializzare da XmlSerializer.
I metodi non possono essere serializzati.
XmlSerializer può elaborare classi che implementano IEnumerable o ICollection in modo diverso se soddisfano determinati requisiti, come indicato di seguito.
Una classe che implementa IEnumerable deve implementare un metodo Add pubblico che accetta un singolo parametro. Il parametro del metodo Add deve essere coerente (polimorfico) con il tipo restituito dalla proprietà IEnumerator.Current restituito dal metodo GetEnumerator .
Una classe che implementa ICollection oltre a IEnumerable (ad esempio CollectionBase) deve disporre di una proprietà pubblica Item indicizzata (un indicizzatore in C#) che accetta un numero intero e deve avere una proprietà Count pubblica di tipo integer. Il parametro passato al metodo Add deve essere lo stesso tipo restituito dalla proprietà Item o una delle basi di quel tipo.
Per le classi che implementano ICollection, i valori da serializzare vengono recuperati dalla proprietà Item indicizzata anziché chiamando GetEnumerator. Inoltre, i campi pubblici e le proprietà non vengono serializzati, ad eccezione dei campi pubblici che restituiscono un'altra classe di raccolta (una che implementa ICollection). Per un esempio, vedere Esempi di serializzazione XML.
Mapping dei tipi di dati XSD
Il documento W3C intitolato XML Schema Part 2: Datatypes specifica i tipi di dati semplici consentiti in uno schema XSD (XML Schema Definition Language). Per molti di questi (ad esempio, int e decimal), esiste un tipo di dati corrispondente in .NET. Tuttavia, alcuni tipi di dati XML non hanno un tipo di dati .NET corrispondente, ad esempio il tipo di dati NMTOKEN . In questi casi, se si utilizza lo strumento XML Schema Definition Tool (XML Schema Definition Tool (Xsd.exe)) per generare classi da uno schema, viene applicato un attributo appropriato a un membro della stringa di tipo 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 seguente.
<XmlElement(DataType:="NMTOKEN")> _
Public MyToken As String
[XmlElement(DataType = "NMTOKEN")]
public string MyToken;
Analogamente, se si sta creando una classe che deve essere conforme a uno specifico XML Schema (XSD), è necessario applicare l'attributo appropriato e impostarne la proprietà DataType sul nome del tipo di dati XML desiderato.
Per un elenco completo dei mapping dei tipi, vedere la proprietà DataType per una delle classi di attributi seguenti: