Condividi tramite


Classe System.Xml.Serialization.XmlSerializer

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

La serializzazione XML è il processo di conversione delle proprietà e dei campi pubblici di un oggetto in un formato seriale (in questo caso, XML) per l'archiviazione o il trasporto. La deserializzazione ricrea l'oggetto nello stato originale dall'output XML. È possibile considerare la serializzazione come un modo per salvare lo stato di un oggetto in un flusso o in un buffer. Ad esempio, ASP.NET usa la XmlSerializer classe per codificare i messaggi del servizio Web XML.

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 classi personalizzate, annotare con attributi o usare lo strumento XML Schema Definition Tool (Xsd.exe) per generare le classi in base a un documento XSD (XML Schema Definition) esistente. Se si dispone di uno schema XML, è possibile eseguire il Xsd.exe per produrre un set di classi fortemente tipizzate per lo schema e annotate con attributi per rispettare lo schema durante la serializzazione.

Per trasferire dati tra oggetti e XML è necessario un mapping dai costrutti del linguaggio di programmazione a XML Schema e dallo schema XML ai costrutti del linguaggio di programmazione. Gli XmlSerializer strumenti correlati e come Xsd.exe forniscono il bridge tra queste due tecnologie sia in fase di progettazione che in fase di esecuzione. In fase di progettazione, usare il Xsd.exe per produrre un documento xml schema (con estensione xsd) dalle classi personalizzate o per produrre classi da un determinato schema. In entrambi i casi, le classi vengono annotate con attributi personalizzati per indicare come eseguire il XmlSerializer mapping tra il sistema XML Schema e Common Language Runtime. In fase di esecuzione, le istanze delle classi possono essere serializzate in documenti XML che seguono lo schema specificato. Analogamente, questi documenti XML possono essere deserializzati in oggetti di runtime. Si noti che lo schema XML è facoltativo e non è necessario in fase di progettazione o in fase di esecuzione.

XML generato dal controllo

Per controllare il codice XML generato, è possibile applicare attributi speciali a classi e membri. Ad esempio, per specificare un nome di elemento XML diverso, applicare un XmlElementAttribute oggetto a un campo o una proprietà pubblica e impostare la ElementName proprietà . Per un elenco completo di attributi simili, vedere Attributi che controllano la serializzazione XML. È anche possibile implementare l'interfaccia IXmlSerializable per controllare l'output XML.

Se il codice XML generato deve essere conforme alla sezione 5 del documento World Wide Consortium, Simple Object Access Protocol (SOAP) 1.1, è necessario costruire XmlSerializer con un oggetto XmlTypeMapping. Per controllare ulteriormente il codice XML SOAP codificato, utilizzare gli attributi elencati in Attributi che controllano la serializzazione SOAP codificata.

Con è possibile sfruttare l'uso XmlSerializer di classi fortemente tipate e avere comunque la flessibilità di XML. Usando campi o proprietà di tipo XmlElemento XmlAttributeXmlNode nelle classi fortemente tipizzate, è possibile leggere parti del documento XML direttamente in oggetti XML.

Se si usano XML Schema estendibili, è anche possibile utilizzare gli XmlAnyElementAttribute attributi e XmlAnyAttributeAttribute per serializzare e deserializzare gli elementi o gli attributi non trovati nello schema originale. Per utilizzare gli oggetti, applicare un oggetto XmlAnyElementAttribute a un campo che restituisce una matrice di XmlElement oggetti o applicare un XmlAnyAttributeAttribute oggetto a un campo che restituisce una matrice di XmlAttribute oggetti.

Se una proprietà o un campo restituisce un oggetto complesso (come una matrice o l'istanza di una classe), XmlSerializer lo converte in un elemento annidato nel documento XML principale. Ad esempio, la prima classe nel codice seguente restituisce un'istanza della seconda classe.

Public Class MyClass
    Public MyObjectProperty As MyObject
End Class

Public Class MyObject
    Public ObjectName As String
End Class
public class MyClass
{
    public MyObject MyObjectProperty;
}
public class MyObject
{
    public string ObjectName;
}

L'output XML serializzato è simile al seguente:

<MyClass>
  <MyObjectProperty>
  <ObjectName>My String</ObjectName>
  </MyObjectProperty>
</MyClass>

Se uno schema include un elemento facoltativo (minOccurs = '0') o se lo schema include un valore predefinito, sono disponibili due opzioni. Un'opzione consiste nell'usare System.ComponentModel.DefaultValueAttribute per specificare il valore predefinito, come illustrato nel codice seguente.

Public Class PurchaseOrder
    <System.ComponentModel.DefaultValueAttribute ("2002")> _
    Public Year As String
End Class
public class PurchaseOrder
{
    [System.ComponentModel.DefaultValueAttribute ("2002")]
    public string Year;
}

Un'altra opzione consiste nell'usare un modello speciale per creare un campo booleano riconosciuto da XmlSerializere per applicare l'oggetto XmlIgnoreAttribute al campo . Il modello viene creato sotto forma di propertyNameSpecified. Ad esempio, se è presente un campo denominato "MyFirstName", si creerebbe anche un campo denominato "MyFirstNameSpecified" che indica XmlSerializer se generare l'elemento XML denominato "MyFirstName". come illustrato nell'esempio seguente.

Public Class OptionalOrder
    ' This field's value should not be serialized
    ' if it is uninitialized.
    Public FirstOrder As String

    ' Use the XmlIgnoreAttribute to ignore the
    ' special field named "FirstOrderSpecified".
    <System.Xml.Serialization.XmlIgnoreAttribute> _
    Public FirstOrderSpecified As Boolean
End Class
public class OptionalOrder
{
    // This field should not be serialized
    // if it is uninitialized.
    public string FirstOrder;

    // Use the XmlIgnoreAttribute to ignore the
    // special field named "FirstOrderSpecified".
    [System.Xml.Serialization.XmlIgnoreAttribute]
    public bool FirstOrderSpecified;
}

Eseguire l'override della serializzazione predefinita

È anche possibile eseguire l'override della serializzazione di qualsiasi set di oggetti e dei relativi campi e proprietà creando uno degli attributi appropriati e aggiungendolo a un'istanza della XmlAttributes classe . L'override della serializzazione in questo modo prevede due usi: per prima cosa, è possibile controllare e aumentare la serializzazione degli oggetti trovati in una DLL, anche se non si ha accesso all'origine; in secondo luogo, è possibile creare un set di classi serializzabili, ma serializzare gli oggetti in più modi. Per altri dettagli, vedere la classe e Procedura: Controllare la XmlAttributeOverrides serializzazione delle classi derivate.

Per serializzare un oggetto, chiamare il Serialize metodo . Per deserializzare un oggetto, chiamare il Deserialize metodo .

Per aggiungere spazi dei nomi XML a un documento XML, vedere XmlSerializerNamespaces.

Nota

fornisce XmlSerializer un trattamento speciale alle classi che implementano IEnumerable o ICollection. Una classe che implementa IEnumerable deve implementare un metodo Add pubblico che accetta un solo parametro. Il Add parametro del metodo deve essere dello stesso tipo restituito dalla Current proprietà sul valore restituito da GetEnumeratoro da una delle basi di quel tipo. Una classe che implementa ICollection ( ad esempio CollectionBase) oltre a IEnumerable deve avere una proprietà indicizzata pubblica Item (indicizzatore in C#) che accetta un numero intero e deve avere una proprietà pubblica Count di tipo integer. Il parametro del Add metodo deve essere lo stesso tipo restituito dalla Item proprietà o una delle basi di tale tipo. Per le classi che implementano ICollection, i valori da serializzare vengono recuperati dalla proprietà indicizzata Item , non chiamando GetEnumerator.

Per deserializzare un oggetto, è necessario disporre dell'autorizzazione per scrivere nella directory temporanea , come definito dalla variabile di ambiente TEMP.

Assembly generati dinamicamente

Per migliorare le prestazioni, l'infrastruttura di serializzazione XML genera dinamicamente assembly per serializzare e deserializzare i tipi specificati. L'infrastruttura trova e riutilizza tali assembly. Questo comportamento si verifica solo quando si usano i costruttori seguenti:

XmlSerializer.XmlSerializer(Type)

XmlSerializer.XmlSerializer(Type, String)

Se si usa uno degli altri costruttori, vengono generate più versioni dello stesso assembly e non vengono mai scaricate, con una perdita di memoria e prestazioni scarse. La soluzione più semplice consiste nell'usare uno dei due costruttori indicati in precedenza. In caso contrario, è necessario memorizzare nella cache gli assembly in un Hashtableoggetto , come illustrato nell'esempio seguente.

Hashtable serializers = new Hashtable();

// Use the constructor that takes a type and XmlRootAttribute.
XmlSerializer s = new XmlSerializer(typeof(MyClass), myRoot);

// Implement a method named GenerateKey that creates unique keys
// for each instance of the XmlSerializer. The code should take
// into account all parameters passed to the XmlSerializer
// constructor.
object key = GenerateKey(typeof(MyClass), myRoot);

// Check the local cache for a matching serializer.
XmlSerializer ser = (XmlSerializer)serializers[key];
if (ser == null)
{
    ser = new XmlSerializer(typeof(MyClass), myRoot);
    // Cache the serializer.
    serializers[key] = ser;
}

// Use the serializer to serialize or deserialize.
Dim serializers As New Hashtable()

' Use the constructor that takes a type and XmlRootAttribute.
Dim s As New XmlSerializer(GetType([MyClass]), myRoot)

' Implement a method named GenerateKey that creates unique keys
' for each instance of the XmlSerializer. The code should take
' into account all parameters passed to the XmlSerializer
' constructor.
Dim key As Object = GenerateKey(GetType([MyClass]), myRoot)

' Check the local cache for a matching serializer.
Dim ser As XmlSerializer = CType(serializers(key), XmlSerializer)

If ser Is Nothing Then
    ser = New XmlSerializer(GetType([MyClass]), myRoot)
    ' Cache the serializer.
    serializers(key) = ser
End If

' Use the serializer to serialize or deserialize.

Serializzazione di ArrayList ed elenco generico

Impossibile XmlSerializer serializzare o deserializzare quanto segue:

Serializzazione delle enumerazioni di long senza segno

Impossibile XmlSerializer creare un'istanza di per serializzare un'enumerazione se le condizioni seguenti sono vere: l'enumerazione è di tipo unsigned long (ulong in C#) e l'enumerazione contiene qualsiasi membro con un valore maggiore di 9.223.372.036.854.775.807. Ad esempio, non è possibile serializzare quanto segue.

public enum LargeNumbers: ulong
{
    a = 9223372036854775808
}
// At run time, the following code will fail.
xmlSerializer mySerializer=new XmlSerializer(typeof(LargeNumbers));

Tipi obsoleti

La XmlSerializer classe non serializza gli oggetti contrassegnati come [Obsolete].