Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.
La serialización XML es el proceso de convertir las propiedades y campos públicos de un objeto en un formato serie (en este caso, XML) para el almacenamiento o el transporte. La deserialización vuelve a crear el objeto en su estado original a partir de la salida XML. Puede considerar la serialización como una manera de guardar el estado de un objeto en un flujo o búfer. Por ejemplo, ASP.NET usa la XmlSerializer clase para codificar mensajes de servicio web XML.
Los datos de los objetos se describen mediante construcciones del lenguaje de programación como clases, campos, propiedades, tipos primitivos, matrices e incluso XML incrustado en forma de XmlElement objetos o XmlAttribute . Tiene la opción de crear sus propias clases, anotadas con atributos o mediante la Herramienta de definición de esquemas XML (Xsd.exe) para generar las clases basadas en un documento de definición de esquema XML (XSD). Si tiene un esquema XML, puede ejecutar el Xsd.exe para generar un conjunto de clases fuertemente tipadas en el esquema y anotadas con atributos que se adhieren al esquema cuando se serializan.
Para transferir datos entre objetos y XML, se requiere una asignación de las construcciones del lenguaje de programación al esquema XML y del esquema XML a las construcciones del lenguaje de programación. Las XmlSerializer y las herramientas relacionadas como Xsd.exe proporcionan el puente entre estas dos tecnologías tanto durante el diseño como en la ejecución. En tiempo de diseño, use el Xsd.exe para generar un documento de esquema XML (.xsd) desde las clases personalizadas o para generar clases a partir de un esquema determinado. En cualquier caso, las clases se anotan con atributos personalizados para indicar a XmlSerializer cómo asignar entre el sistema de esquema XML y Common Language Runtime. En tiempo de ejecución, las instancias de las clases se pueden serializar en documentos XML que siguen el esquema especificado. Del mismo modo, estos documentos XML se pueden deserializar en objetos en tiempo de ejecución. Tenga en cuenta que el esquema XML es opcional y no es necesario en tiempo de diseño o tiempo de ejecución.
Control del código XML generado
Para controlar el XML generado, puede aplicar atributos especiales a clases y miembros. Por ejemplo, para especificar un nombre de elemento XML diferente, aplique un objeto XmlElementAttribute a un campo o propiedad público y establezca la ElementName propiedad . Para obtener una lista completa de atributos similares, vea Atributos que controlan la serialización XML. También puede implementar la IXmlSerializable interfaz para controlar la salida XML.
Si el XML generado debe ajustarse a la sección 5 del documento del Consorcio World Wide Web, Protocolo simple de acceso a objetos (SOAP) 1.1, debe construir el XmlSerializer con un XmlTypeMapping. Para controlar aún más el XML SOAP codificado, use los atributos enumerados en Atributos que controlan la serialización SOAP codificada.
Con XmlSerializer puede aprovechar las ventajas de trabajar con clases fuertemente tipadas y seguir teniendo la flexibilidad de XML. Con campos o propiedades de tipo XmlElement, XmlAttribute o XmlNode en las clases fuertemente tipadas, puede leer partes del documento XML directamente en objetos XML.
Si trabaja con esquemas XML extensibles, también puede usar los XmlAnyElementAttribute atributos y XmlAnyAttributeAttribute para serializar y deserializar elementos o atributos que no se encuentran en el esquema original. Para usar los objetos , aplique un objeto XmlAnyElementAttribute a un campo que devuelva una matriz de XmlElement objetos o aplique un XmlAnyAttributeAttribute objeto a un campo que devuelva una matriz de XmlAttribute objetos.
Si una propiedad o campo devuelve un objeto complejo (como una matriz o una instancia de clase), lo XmlSerializer convierte en un elemento anidado dentro del documento XML principal. Por ejemplo, la primera clase del código siguiente devuelve una instancia de la segunda clase.
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;
}
La salida XML serializada tiene este aspecto:
<MyClass>
<MyObjectProperty>
<ObjectName>My String</ObjectName>
</MyObjectProperty>
</MyClass>
Si un esquema incluye un elemento opcional (minOccurs = '0'), o si el esquema incluye un valor predeterminado, tiene dos opciones. Una opción es usar System.ComponentModel.DefaultValueAttribute para especificar el valor predeterminado, como se muestra en el código siguiente.
Public Class PurchaseOrder
<System.ComponentModel.DefaultValueAttribute ("2002")> _
Public Year As String
End Class
public class PurchaseOrder
{
[System.ComponentModel.DefaultValueAttribute ("2002")]
public string Year;
}
Otra opción es usar un patrón especial para crear un campo booleano reconocido por XmlSerializer, y aplicar al campo XmlIgnoreAttribute. El patrón se crea en forma de propertyNameSpecified
. Por ejemplo, si hay un campo denominado "MyFirstName", también crearía un campo denominado "MyFirstNameSpecified" que indica XmlSerializer si se debe generar el elemento XML denominado "MyFirstName". Esto se muestra en el ejemplo siguiente.
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;
}
Invalidación de la serialización predeterminada
También puede invalidar la serialización de cualquier conjunto de objetos y sus campos y propiedades creando uno de los atributos adecuados y agregándolo a una instancia de la XmlAttributes clase . La invalidación de la serialización de esta manera tiene dos usos: en primer lugar, puede controlar y aumentar la serialización de objetos que se encuentran en un archivo DLL, incluso si no tiene acceso al origen; en segundo lugar, puede crear un conjunto de clases serializables, pero serializar los objetos de varias maneras. Para obtener más información, vea la XmlAttributeOverrides clase y el artículo cómo controlar la serialización de clases derivadas.
Para serializar un objeto, llame al Serialize método . Para deserializar un objeto, llame al Deserialize método .
Para agregar espacios de nombres XML a un documento XML, vea XmlSerializerNamespaces.
Nota:
XmlSerializer proporciona un tratamiento especial a las clases que implementan IEnumerable o ICollection. Una clase que implementa IEnumerable debe implementar un método público Add
que toma un único parámetro. El parámetro del método Add
debe ser del mismo tipo que se devuelve de la propiedad Current
en el valor devuelto desde GetEnumerator
, o bien una de las bases de ese tipo. Una clase que implementa ICollection (como CollectionBase), además de IEnumerable, debe tener una propiedad indexada pública Item
(indexador en C#) que acepta un entero, y debe tener una propiedad pública Count
de tipo entero. El parámetro del método Add
debe ser del mismo tipo que el devuelto por la propiedad Item
, o una de las bases de dicho tipo. En el caso de las clases que implementan ICollection, los valores que se van a serializar se recuperan de la propiedad indizada Item
, no llamando a GetEnumerator
.
Debe tener permiso para escribir en el directorio temporal (tal como se define en la variable de entorno TEMP) para deserializar un objeto.
Ensamblados generados dinámicamente
Para aumentar el rendimiento, la infraestructura de serialización XML genera dinámicamente ensamblados para serializar y deserializar tipos especificados. La infraestructura busca y reutiliza esos ensamblados. Este comportamiento solo se produce cuando se usan los constructores siguientes:
XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
Si usa cualquiera de los otros constructores, se generan varias versiones del mismo ensamblado y nunca se descargan, lo que produce una pérdida de memoria y un rendimiento deficiente. La solución más sencilla es usar uno de los dos constructores mencionados anteriormente. De lo contrario, debe almacenar en caché los ensamblados en una instancia de Hashtable, como se muestra en el ejemplo siguiente.
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.
Serialización de ArrayList y lista genérica
XmlSerializer no puede serializar ni deserializar lo siguiente:
Serialización de enumeraciones de Long sin signo
No se puede instanciar XmlSerializer para serializar una enumeración si se cumplen las siguientes condiciones: la enumeración es de tipo unsigned long (ulong
en C#) y la enumeración contiene algún miembro con un valor superior a 9.223.372.036.854.775.807. Por ejemplo, no se puede serializar lo siguiente.
public enum LargeNumbers: ulong
{
a = 9223372036854775808
}
// At run time, the following code will fail.
xmlSerializer mySerializer=new XmlSerializer(typeof(LargeNumbers));
Tipos obsoletos
La XmlSerializer clase no serializa los objetos marcados como [Obsolete]
.