Introduzione alla serializzazione XMLIntroducing XML Serialization

La serializzazione è il processo di conversione di un oggetto in un formato che può essere agevolmente trasportato.Serialization is the process of converting an object into a form that can be readily transported. Ad esempio, è possibile serializzare un oggetto e trasferirlo via Internet tramite protocollo HTTP tra un client e un server.For example, you can serialize an object and transport it over the Internet using HTTP between a client and a server. Viceversa, la deserializzazione ricostruisce l'oggetto dal flusso.On the other end, deserialization reconstructs the object from the stream.

La serializzazione XML serializza solo i campi pubblici e i valori di proprietà di un oggetto in un flusso XML.XML serialization serializes only the public fields and property values of an object into an XML stream. La serializzazione XML non include informazioni sul tipo.XML serialization does not include type information. Ad esempio, se un oggetto Book è incluso nello spazio dei nomi Library, non vi è alcuna garanzia che venga deserializzato in un oggetto dello stesso tipo.For example, if you have a Book object that exists in the Library namespace, there is no guarantee that it is deserialized into an object of the same type.

Nota

La serializzazione XML non converte metodi, indicizzatori o proprietà in sola lettura (salvo le raccolte in sola lettura).XML serialization does not convert methods, indexers, private fields, or read-only properties (except read-only collections). Per serializzare tutti i campi e le proprietà di un oggetto, pubblici e privati, utilizzare DataContractSerializer invece della serializzazione XML.To serialize all an object's fields and properties, both public and private, use the DataContractSerializer instead of XML serialization.

La classe centrale nella serializzazione XML è la classe XmlSerializer e i metodi più importanti in questa classe sono i metodi Serialize e Deserialize.The central class in XML serialization is the XmlSerializer class, and the most important methods in this class are the Serialize and Deserialize methods. La classe XmlSerializer crea file C# e li compila in file dll per eseguire tale serializzazione.The XmlSerializer creates C# files and compiles them into .dll files to perform this serialization. In .NET Framework 2.0 lo strumento per la generazione di serializzatori XML (Sgen.exe) è progettato per generare in anticipo questi assembly di serializzazione perché vengano distribuiti con l'applicazione, in modo da migliorare le prestazioni di avvio.In .NET Framework 2.0, the XML Serializer Generator Tool (Sgen.exe) is designed to generate these serialization assemblies in advance to be deployed with your application and improve startup performance. Il flusso XML generato dal XmlSerializer è conforme a del World Wide Web Consortium (W3C) linguaggio di definizione XML Schema (XSD) 1.0 recommendation.The XML stream generated by the XmlSerializer is compliant with the World Wide Web Consortium (W3C) XML Schema definition language (XSD) 1.0 recommendation. Inoltre, i tipi di dati generati sono conformi al documento intitolato "XML Schema Part 2: Tipi di dati."Furthermore, the data types generated are compliant with the document titled "XML Schema Part 2: Datatypes."

I dati negli oggetti vengono descritti tramite costrutti del linguaggio di programmazione come classi, campi, proprietà, tipi primitivi, matrici e anche XML incorporato sotto forma di oggetti XmlElement o XmlAttribute.The data in your objects is described using programming language constructs like classes, fields, properties, primitive types, arrays, and even embedded XML in the form of XmlElement or XmlAttribute objects. È possibile creare le classi, annotate con attributi, o utilizzare lo strumento XML Schema Definition per generare le classi basate su uno schema XML esistente.You have the option of creating your own classes, annotated with attributes, or using the XML Schema Definition tool to generate the classes based on an existing XML Schema.

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.If you have an XML Schema, you can run the XML Schema Definition tool to produce a set of classes that are strongly typed to the schema and annotated with attributes. Quando viene serializzata un'istanza di tale classe, l'XML generato è conforme allo schema XML.When an instance of such a class is serialized, the generated XML adheres to the XML Schema. 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.Provided with such a class, you can program against an easily manipulated object model while being assured that the generated XML conforms to the XML schema. Si tratta di un'alternativa all'uso di altre classi in .NET Framework, ad esempio le classi XmlReader e XmlWriter, per analizzare e scrivere un flusso XML.This is an alternative to using other classes in the .NET Framework, such as the XmlReader and XmlWriter classes, to parse and write an XML stream. Per altre informazioni, vedere XML Documents and Data (Documenti e dati XML).For more information, see XML Documents and Data. Queste classi consentono di analizzare qualsiasi flusso XML.These classes allow you to parse any XML stream. Al contrario, usare XmlSerializer quando si prevede che il flusso XML sarà conforme a un oggetto XML Schema noto.In contrast, use the XmlSerializer when the XML stream is expected to conform to a known XML Schema.

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 altre voci per il flusso XML.Attributes control the XML stream generated by the XmlSerializer class, allowing you to set the XML namespace, element name, attribute name, and so on, of the XML stream. Per altre informazioni su questi attributi e sul modo in cui controllano la serializzazione XML, vedere Controllo della serializzazione XML mediante attributi.For more information about these attributes and how they control XML serialization, see Controlling XML Serialization Using Attributes. Per una tabella degli attributi usati per controllare l'XML generato, vedere Attributi per il controllo della serializzazione XML.For a table of those attributes that are used to control the generated XML, see Attributes That Control XML Serialization.

La classe XmlSerializer può serializzare ulteriormente un oggetto e può generare un flusso XML SOAP codificato.The XmlSerializer class can further serialize an object and generate an encoded SOAP XML stream. L'elemento XML generato risulta conforme alla sezione 5 del documento "Simple Object Access Protocol (SOAP) 1.1" del World Wide Web Consortium.The generated XML adheres to section 5 of the World Wide Web Consortium document titled "Simple Object Access Protocol (SOAP) 1.1." Per altre informazioni su questo processo, vedere come: Serializzare un oggetto come un Stream XML con codifica SOAP.For more information about this process, see How to: Serialize an Object as a SOAP-Encoded XML Stream. Per una tabella degli attributi che controllano l'XML generato, vedere Attributi per il controllo della serializzazione SOAP codificata.For a table of the attributes that control the generated XML, see Attributes That Control Encoded SOAP Serialization.

La classe XmlSerializer genera i messaggi SOAP creati dai e passati ai servizi Web XML.The XmlSerializer class generates the SOAP messages created by, and passed to, XML Web services. 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).To control the SOAP messages, you can apply attributes to the classes, return values, parameters, and fields found in an XML Web service file (.asmx). È possibile utilizzare 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ò utilizzare sia lo stile SOAP letterale che quello codificato.You can use both the attributes listed in "Attributes That Control XML Serialization" and "Attributes That Control Encoded SOAP Serialization" because an XML Web service can use either the literal or encoded SOAP style. Per altre informazioni sull'uso di attributi per controllare l'XML generato da un servizio Web XML, vedere Serializzazione XML con servizi Web XML.For more information about using attributes to control the XML generated by an XML Web service, see XML Serialization with XML Web Services. Per altre informazioni sui servizi Web SOAP e XML, vedere personalizzazione di formattazione dei messaggi SOAP.For more information about SOAP and XML Web services, see Customizing SOAP Message Formatting.

Considerazioni sulla sicurezza per le applicazioni XmlSerializerSecurity Considerations for XmlSerializer Applications

Quando si crea un'applicazione che usa la classe XmlSerializer, è necessario tenere presenti le informazioni seguenti e le implicazioni correlate:When creating an application that uses the XmlSerializer, you should be aware of the following items and their implications:

  • La classe XmlSerializer crea file C# (CS) e li compila in file DLL nella directory denominata dalla variabile di ambiente TEMP. La serializzazione viene eseguita con questi file DLL.The XmlSerializer creates C# (.cs) files and compiles them into .dll files in the directory named by the TEMP environment variable; serialization occurs with those DLLs.

    Nota

    Questi assembly di serializzazione possono essere generati in anticipo ed essere firmati tramite lo strumento SGen.exe.These serialization assemblies can be generated in advance and signed by using the SGen.exe tool. Tale funzione non è disponibile per i server di servizi Web.This does not work a server of Web services. In altre parole, è disponibile solo per l'utilizzo client e per la serializzazione manuale.In other words, it is only for client use and for manual serialization.

    Il codice e le DLL sono vulnerabili a un processo dannoso al momento della creazione e della compilazione.The code and the DLLs are vulnerable to a malicious process at the time of creation and compilation. Se si utilizza un computer su cui è in esecuzione Microsoft Windows NT 4.0 o versioni successive, è possibile che due o più utenti condividano la directory TEMP.When using a computer running Microsoft Windows NT 4.0 or later, it might be possible for two or more users to share the TEMP directory. La condivisione di una directory TEMP è pericolosa se i due account hanno privilegi di sicurezza diversi e se l'account con privilegi più elevati esegue un'applicazione con XmlSerializer.Sharing a TEMP directory is dangerous if the two accounts have different security privileges and the higher-privilege account runs an application using the XmlSerializer. In tal caso, un utente può compromettere la sicurezza del computer sostituendo il file cs o dll compilato.In this case, one user can breach the computer's security by replacing either the .cs or .dll file that is compiled. Per ovviare a questo problema, accertarsi sempre che ciascun account del computer disponga del proprio profilo.To eliminate this concern, always be sure that each account on the computer has its own profile. Per impostazione predefinita, la variabile di ambiente TEMP fa riferimento a una directory diversa per ciascun account.By default, the TEMP environment variable points to a different directory for each account.

  • Se un utente malintenzionato invia un flusso continuo di dati XML a un server Web (attacco Denial of Service), XmlSerializer continua a elaborare i dati fino all'esaurimento delle risorse del computer.If a malicious user sends a continuous stream of XML data to a Web server (a denial of service attack), then the XmlSerializer continues to process the data until the computer runs low on resources.

    Questo tipo di attacco può essere impedito se si utilizza un computer su cui è in esecuzione Internet Information Services (IIS) e l'applicazione è in esecuzione all'interno di IIS.This kind of attack is eliminated if you are using a computer running Internet Information Services (IIS), and your application is running within IIS. IIS dispone di un modulo di verifica che non elabora i flussi maggiori di una determinata dimensione (l'impostazione predefinita è 4 KB).IIS features a gate that does not process streams longer than a set amount (the default is 4 KB). Se si crea un'applicazione che non usa IIS e che esegue la deserializzazione con XmlSerializer, è necessario implementare un controllo simile per impedire un attacco Denial of Service.If you create an application that does not use IIS and deserializes with the XmlSerializer, you should implement a similar gate that prevents a denial of service attack.

  • XmlSerializer serializza i dati ed esegue tutto il codice usando qualsiasi tipo assegnato.The XmlSerializer serializes data and runs any code using any type given to it.

    Un oggetto non autorizzato può presentare una minaccia in due modi.There are two ways in which a malicious object presents a threat. L'oggetto può eseguire codice dannoso o inserire codice dannoso nel file C# creato da XmlSerializer.It could run malicious code or it could inject malicious code into the C# file created by the 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.In the first case, if a malicious object tries to run a destructive procedure, code access security helps prevent any damage from being done. Nel secondo caso, esiste una possibilità teorica che un oggetto non autorizzato possa inserire in qualche modo codice nel file C# creato da XmlSerializer.In the second case, there is a theoretical possibility that a malicious object may somehow inject code into the C# file created by the 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.Although this issue has been examined thoroughly, and such an attack is considered unlikely, you should take the precaution of never serializing data with an unknown and untrusted type.

  • I dati sensibili serializzati potrebbero essere vulnerabili.Serialized sensitive data might be vulnerable.

    Dopo il XmlSerializer ha serializzato i dati, può essere archiviato come un file XML o un altro archivio dati.After the XmlSerializer has serialized data, it can be stored as an XML file or other data store. Se l'archivio dati è disponibile per altri processi o è visibile su una Intranet o Internet, i dati possono essere rubati e utilizzati in modo dannoso.If your data store is available to other processes, or is visible on an intranet or the Internet, the data can be stolen and used maliciously. Ad esempio, se si crea un'applicazione che serializza ordini che includono numeri di carta di credito, i dati risultano essere estremamente riservati.For example, if you create an application that serializes orders that include credit card numbers, the data is highly sensitive. Per evitare ciò, proteggere sempre l'archivio per i dati ed eseguire le operazioni per mantenerli privati.To help prevent this, always protect the store for your data and take steps to keep it private.

Serializzazione di una classe sempliceSerialization of a Simple Class

Nell'esempio di codice riportato di seguito viene mostrata una classe di base con un campo pubblico.The following code example shows a basic class with a public field.

Public Class OrderForm
    Public OrderDate As DateTime
End Class
public class OrderForm
{
    public DateTime OrderDate;
}

Quando un'istanza di questa classe viene serializzata, potrebbe assomigliare agli elementi seguenti.When an instance of this class is serialized, it might resemble the following.

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

Per altri esempi di serializzazione, vedere Esempi di serializzazione XML.For more examples of serialization, see Examples of XML Serialization.

Elementi che possono essere serializzatiItems That Can Be Serialized

Gli elementi seguenti possono essere serializzati con la classe XmlSerializer:The following items can be serialized using the XmLSerializer class:

  • Proprietà di lettura/scrittura pubbliche e campi di classi pubbliche.Public read/write properties and fields of public classes.

  • Classi che implementano ICollection o IEnumerable.Classes that implement ICollection or IEnumerable.

    Nota

    Vengono serializzate solo le raccolte e non le proprietà pubbliche.Only collections are serialized, not public properties.

  • Oggetti XmlElement.XmlElement objects.

  • Oggetti XmlNode.XmlNode objects.

  • Oggetti DataSet.DataSet objects.

Per altre informazioni sulla serializzazione o deserializzazione di oggetti, vedere come: Serializzare un oggetto e come: Deserializzare un oggetto.For more information about serializing or deserializing objects, see How to: Serialize an Object and How to: Deserialize an Object.

Vantaggi dell'utilizzo della serializzazione XMLAdvantages of Using XML Serialization

Il XmlSerializer classe ti offre controllo completo e flessibile durante la serializzazione di un oggetto come XML.The XmlSerializer class gives you complete and flexible control when you serialize an object as 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.If you are creating an XML Web service, you can apply attributes that control serialization to classes and members to ensure that the XML output conforms to a specific schema.

Ad esempio, XmlSerializer permette di:For example, XmlSerializer enables you to:

  • Specificare se un campo o una proprietà devono essere codificati come attributo o elemento.Specify whether a field or property should be encoded as an attribute or an element.

  • Specificare un spazio dei nomi XML da utilizzare.Specify an XML namespace to use.

  • Specificare il nome di un elemento o di un attributo se un nome di campo o proprietà non è appropriato.Specify the name of an element or attribute if a field or property name is inappropriate.

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.Another advantage of XML serialization is that you have no constraints on the applications you develop, as long as the XML stream that is generated conforms to a given schema. Immaginare uno schema utilizzato per descrivere libri.Imagine a schema that is used to describe books. Lo schema riporta un elemento titolo, autore, editore autore e numero ISBN.It features a title, author, publisher, and ISBN number element. È 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.You can develop an application that processes the XML data in any way you want, for example, as a book order, or as an inventory of books. In entrambi i casi, l'unico requisito è che il flusso XML sia conforme allo schema XSD (XML Schema definition) specificato.In either case, the only requirement is that the XML stream conforms to the specified XML Schema definition language (XSD) schema.

Considerazioni sulla serializzazione XMLXML Serialization Considerations

Di seguito sono riportati alcuni aspetti da tenere presenti quando si usa la classe XmlSerializer:The following should be considered when using the XmlSerializer class:

  • Lo strumento Sgen.exe è progettato espressamente per generare assembly di serializzazione per prestazioni ottimali.The Sgen.exe tool is expressly designed to generate serialization assemblies for optimum performance.

  • I dati serializzati contengono solo i dati stessi e la struttura delle classi.The serialized data contains only the data itself and the structure of your classes. Le informazioni sull'identità e sull'assembly non sono incluse.Type identity and assembly information are not included.

  • È possibile serializzare solo le proprietà e i campi pubblici.Only public properties and fields can be serialized. Le proprietà devono disporre di funzioni di accesso pubbliche (metodi get e set).Properties must have public accessors (get and set methods). Se è necessario serializzare dati non pubblici, utilizzare la classe DataContractSerializer anziché la serializzazione XML.If you must serialize non-public data, use the DataContractSerializer class rather than XML serialization.

  • Una classe deve avere un costruttore senza parametri da serializzare tramite XmlSerializer.A class must have a parameterless constructor to be serialized by XmlSerializer.

  • I metodi non possono essere serializzati.Methods cannot be serialized.

  • XmlSerializer può elaborare le classi che implementano IEnumerable o ICollection in modo diverso se queste classi soddisfano determinati requisiti, indicati di seguito.XmlSerializer can process classes that implement IEnumerable or ICollection differently if they meet certain requirements, as follows.

    Una classe che implementa IEnumerable deve implementare un metodo Add pubblico che accetta un solo parametro.A class that implements IEnumerable must implement a public Add method that takes a single parameter. Il parametro del metodo Add deve essere coerente (polimorfico) al tipo restituito dalla proprietà IEnumerator.Current restituita dal metodo GetEnumerator.The Add method's parameter must be consistent (polymorphic) with the type returned from the IEnumerator.Current property returned from the GetEnumerator method.

    Una classe che implementa ICollection oltre a IEnumerable, ad esempio CollectionBase, deve includere una proprietà indicizzata Item pubblica (indicizzatore in C#) che accetta un intero e una proprietà Count pubblica di tipo integer.A class that implements ICollection in addition to IEnumerable (such as CollectionBase) must have a public Item indexed property (an indexer in C#) that takes an integer and it must have a public Count property of type 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.The parameter passed to the Add method must be the same type as that returned from the Item property, or one of that type's bases.

    Per le classi che implementano ICollection, i valori da serializzare vengono recuperati dalla proprietà Item indicizzata anziché chiamando GetEnumerator.For classes that implement ICollection, values to be serialized are retrieved from the indexed Item property rather than by calling GetEnumerator. Inoltre, le proprietà e i campi pubblici non vengono serializzati, ad eccezione dei campi pubblici che restituiscono un'altra classe di raccolte (una che implementa ICollection).Also, public fields and properties are not serialized, with the exception of public fields that return another collection class (one that implements ICollection). Per un esempio, vedere Esempi di serializzazione XML.For an example, see Examples of XML Serialization.

Mappatura del tipo di dati XSDXSD Data Type Mapping

Il documento W3C XML Schema Part 2: Tipi di dati specifica i tipi di dati semplici consentiti in uno schema di XML Schema definition language (XSD).The W3C document titled XML Schema Part 2: Datatypes specifies the simple data types that are allowed in an XML Schema definition language (XSD) schema. Per molti di questi, ad esempio int e decimal, esiste un tipo di dati corrispondente in .NET Framework.For many of these (for example, int and decimal), there is a corresponding data type in the .NET Framework. Tuttavia, per alcuni tipi di dati XML non esiste un tipo di dati corrispondente in .NET Framework, ad esempio il tipo di dati NMTOKEN.However, some XML data types do not have a corresponding data type in the .NET Framework (for example, the NMTOKEN data type). Se in questi casi 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.In such cases, if you use the XML Schema Definition tool (XML Schema Definition Tool (Xsd.exe)) to generate classes from a schema, an appropriate attribute is applied to a member of type string, and its DataType property is set to the XML data type name. Ad esempio, se uno schema contiene un elemento denominato "MyToken" con il tipo di dati XML NMTOKEN, la classe generata può contenere un membro come quello mostrato nell'esempio seguente.For example, if a schema contains an element named "MyToken" with the XML data type NMTOKEN, the generated class might contain a member as shown in the following example.

<XmlElement(DataType:="NMTOKEN")> _
Public MyToken As String
[XmlElement(DataType = "NMTOKEN")]
public string MyToken;

Analogamente, se si crea una classe che deve essere conforme a un oggetto XML Schema (XSD) specifico, è necessario applicare l'attributo appropriato e impostarne la proprietà DataType sul nome del tipo di dati XML desiderato.Similarly, if you are creating a class that must conform to a specific XML Schema (XSD), you should apply the appropriate attribute and set its DataType property to the desired XML data type name.

Per un elenco completo dei mapping dei tipi, vedere la proprietà DataType per una delle classi di attributo seguenti:For a complete list of type mappings, see the DataType property for any of the following attribute classes:

Vedere ancheSee also