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.
La serialización es el proceso de convertir un objeto en un formulario que se puede transportar fácilmente. Por ejemplo, puede serializar un objeto y transportarlo a través de Internet mediante HTTP entre un cliente y un servidor. En el otro extremo, la deserialización reconstruye el objeto a partir del flujo de datos.
La serialización XML serializa solo los campos públicos y los valores de propiedad de un objeto en un flujo XML. La serialización XML no incluye información de tipo. Por ejemplo, si tiene un objeto Book que existe en el espacio de nombres Library , no hay ninguna garantía de que se deserialice en un objeto del mismo tipo.
Nota:
La serialización XML no convierte métodos, indexadores, campos privados ni propiedades de solo lectura (excepto colecciones de solo lectura). Para serializar todos los campos y propiedades de un objeto, tanto públicos como privados, use DataContractSerializer en lugar de la serialización XML.
La clase central de la serialización XML es la XmlSerializer clase y los métodos más importantes de esta clase son los métodos Serialize y Deserialize . XmlSerializer crea archivos de C# y los compila en .dll archivos para realizar esta serialización. La herramienta generadora de serializadores XML (Sgen.exe) está diseñada para generar estos ensamblados de serialización de antemano para desplegarse con su aplicación y mejorar el rendimiento de inicio. La secuencia XML generada por XmlSerializer es compatible con la recomendación del lenguaje de definición de esquema XML (XSD) 1.0 de World Wide Web Consortium (W3C). Además, los tipos de datos generados son compatibles con el documento titulado "Esquema XML Parte 2: Tipos de datos".
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 objetos XmlElement o XmlAttribute . Tiene la opción de crear sus propias clases, anotadas con atributos o mediante la herramienta definición de esquema XML para generar las clases basadas en un esquema XML existente.
Si tiene un esquema XML, puede ejecutar la herramienta definición de esquema XML para generar un conjunto de clases fuertemente tipadas en el esquema y anotadas con atributos. Cuando se serializa una instancia de dicha clase, el XML generado se adhiere al esquema XML. Con esta clase, puede programar en un modelo de objetos fácilmente manipulable mientras se asegura de que el XML generado está conforme al esquema XML. Se trata de una alternativa al uso de otras clases en .NET, como las clases XmlReader y XmlWriter , para analizar y escribir una secuencia XML. Para obtener más información, vea Documentos y datos XML. Estas clases permiten analizar cualquier secuencia XML. Por el contrario, use XmlSerializer cuando se espera que la secuencia XML se ajuste a un esquema XML conocido.
Los atributos controlan la secuencia XML generada por la clase XmlSerializer , lo que permite establecer el espacio de nombres XML, el nombre del elemento, el nombre del atributo, etc. de la secuencia XML. Para obtener más información sobre estos atributos y cómo controlan la serialización XML, vea Controlar la serialización XML mediante atributos. Para obtener una tabla de esos atributos que se usan para controlar el XML generado, vea Atributos que controlan la serialización XML.
La clase XmlSerializer puede serializar aún más un objeto y generar una secuencia XML SOAP codificada. El XML generado se adhiere a la sección 5 del documento world Wide Web Consortium titulado "Protocolo simple de acceso a objetos (SOAP) 1.1". Para obtener más información sobre este proceso, vea How to: Serialize an Object as a SOAP-Encoded XML Stream. Para obtener una tabla de los atributos que controlan el XML generado, vea Atributos que controlan la serialización SOAP codificada.
La clase XmlSerializer genera los mensajes SOAP creados por los servicios web XML y pasados a ellos. Para controlar los mensajes SOAP, puede aplicar atributos a las clases, valores devueltos, parámetros y campos que se encuentran en un archivo de servicio web XML (.asmx). Puede usar los atributos enumerados en "Atributos que controlan la serialización XML" y "Atributos que controlan la serialización SOAP codificada", ya que un servicio web XML puede usar el estilo SOAP literal o codificado. Para obtener más información sobre el uso de atributos para controlar el XML generado por un servicio web XML, vea Serialización XML con servicios web XML. Para obtener más información sobre los servicios web SOAP y XML, vea Personalización del formato de mensajes SOAP.
Consideraciones de seguridad para aplicaciones XmlSerializer
Al crear una aplicación que use XmlSerializer, tenga en cuenta los siguientes elementos y sus implicaciones:
XmlSerializer crea archivos de C# (.cs) y los compila en archivos .dll en el directorio denominado por la variable de entorno TEMP; La serialización se produce con esos archivos DLL.
Nota:
Estos ensamblados de serialización se pueden generar de antemano y firmarlos mediante la herramienta SGen.exe. Esto no funciona en un servidor de servicios web. En otras palabras, solo es para el uso del cliente y para la serialización manual.
El código y los archivos DLL son vulnerables a un proceso malintencionado en el momento de la creación y compilación. Puede que dos o más usuarios compartan el directorio TEMP. El uso compartido de un directorio TEMP es peligroso si las dos cuentas tienen privilegios de seguridad diferentes y la cuenta con privilegios superiores ejecuta una aplicación mediante XmlSerializer. En este caso, un usuario puede infringir la seguridad del equipo reemplazando el archivo .cs o .dll compilado. Para eliminar esta preocupación, asegúrese siempre de que cada cuenta en la computadora tenga su propio perfil. De forma predeterminada, la variable de entorno TEMP apunta a un directorio diferente para cada cuenta.
Si un usuario malintencionado envía un flujo continuo de datos XML a un servidor web (un ataque por denegación de servicio), XmlSerializer continúa procesando los datos hasta que el equipo se ejecuta bajo en recursos.
Este tipo de ataque se elimina si usa un equipo que ejecuta Internet Information Services (IIS) y la aplicación se ejecuta en IIS. IIS incluye una puerta que no procesa flujos más largos que una cantidad establecida (el valor predeterminado es de 4 KB). Si crea una aplicación que no usa IIS y deserializa con XmlSerializer, debe implementar una puerta similar que impida un ataque por denegación de servicio.
XmlSerializer serializa los datos y ejecuta cualquier código con cualquier tipo proporcionado.
Hay dos maneras en que un objeto malintencionado presenta una amenaza. Podría ejecutar código malintencionado o insertar código malintencionado en el archivo C# creado por XmlSerializer. En el segundo caso, existe una posibilidad teórica de que un objeto malintencionado pueda insertar código en el archivo de C# creado por XmlSerializer. Aunque este problema se ha examinado exhaustivamente y este tipo de ataque se considera poco probable, debe tomar la precaución de no serializar nunca los datos con un tipo desconocido y que no es de confianza.
Es posible que los datos confidenciales serializados sean vulnerables.
Una vez que XmlSerializer tiene datos serializados, se puede almacenar como un archivo XML u otro almacén de datos. Si el almacén de datos está disponible para otros procesos o está visible en una intranet o en Internet, los datos se pueden robar y usar de forma malintencionada. Por ejemplo, si crea una aplicación que serializa pedidos que incluyen números de tarjeta de crédito, los datos son muy confidenciales. Para ayudar a evitar esto, proteja siempre el almacén de tus datos y tome medidas para mantenerlos privados.
Serialización de una clase simple
En el ejemplo de código siguiente se muestra una clase básica con un campo público.
Public Class OrderForm
Public OrderDate As DateTime
End Class
public class OrderForm
{
public DateTime OrderDate;
}
Cuando se serializa una instancia de esta clase, puede parecerse a lo siguiente.
<OrderForm>
<OrderDate>12/12/01</OrderDate>
</OrderForm>
Para obtener más ejemplos de serialización, vea Ejemplos de serialización XML.
Elementos que se pueden serializar
Los siguientes elementos se pueden serializar mediante la clase XmlSerializer :
Las propiedades de lectura y escritura públicas y campos de clases públicas.
Clases que implementan ICollection o IEnumerable.
Nota:
Solo se serializan las colecciones, no las propiedades públicas.
Los objetos XmlElement.
Los objetos XmlNode.
Objetos de DataSet .
Para obtener más información sobre cómo serializar o deserializar objetos, vea Cómo: Serializar un objeto y Cómo: Deserializar un objeto.
Ventajas del uso de la serialización XML
La clase XmlSerializer proporciona un control completo y flexible al serializar un objeto como XML. Si va a crear un servicio web XML, puede aplicar atributos que controlan la serialización a clases y miembros para asegurarse de que la salida XML se ajusta a un esquema específico.
Por ejemplo, XmlSerializer permite:
Especifique si un campo o una propiedad se deben codificar como un atributo o un elemento.
Especifique un espacio de nombres XML que se va a usar.
Especifique el nombre de un elemento o atributo si un nombre de campo o propiedad es inadecuado.
Otra ventaja de la serialización XML es que no tiene restricciones en las aplicaciones que desarrolla, siempre que la secuencia XML generada se ajuste a un esquema determinado. Imagine un esquema que se usa para describir libros. Incluye un título, un autor, un publicador y un elemento numérico ISBN. Puede desarrollar una aplicación que procese los datos XML de cualquier manera que desee, por ejemplo, como un pedido de libro o como inventario de libros. En cualquier caso, el único requisito es que la secuencia XML se ajuste al esquema de lenguaje de definición de esquema XML (XSD) especificado.
Consideraciones sobre la serialización XML
Se debe tener en cuenta lo siguiente al usar la clase XmlSerializer :
La herramienta Sgen.exe está diseñada expresamente para generar ensamblados de serialización para un rendimiento óptimo.
Los datos serializados contienen solo los datos en sí y la estructura de las clases. La identidad del tipo y la información del ensamble no están incluidas.
Solo se pueden serializar las propiedades y campos públicos. Las propiedades deben tener descriptores de acceso públicos (métodos get y set). Si debe serializar datos no públicos, use la DataContractSerializer clase en lugar de serialización XML.
Una clase debe tener un constructor sin parámetros para que XmlSerializer serialice.
No se pueden serializar métodos.
XmlSerializer puede procesar clases que implementan IEnumerable o ICollection de forma diferente si cumplen determinados requisitos, como se indica a continuación.
Una clase que implementa IEnumerable debe implementar un método Add público que tome un único parámetro. El parámetro del método Add debe ser coherente (polimórfico) con el tipo devuelto por la propiedad IEnumerator.Current devuelta desde el método GetEnumerator .
Una clase que implementa ICollection además de IEnumerable (como CollectionBase) debe tener una propiedad indexada Item pública (un indexador de C#) que toma un entero y debe tener una propiedad Count pública de tipo entero. El parámetro pasado al método Add debe ser el mismo tipo que el devuelto desde la propiedad Item o una de las bases de ese tipo.
En el caso de las clases que implementan ICollection, los valores que se van a serializar se recuperan de la propiedad Item indizada en lugar de llamar a GetEnumerator. Además, los campos públicos y las propiedades no se serializan, a excepción de los campos públicos que devuelven otra clase de colección (una que implementa ICollection). Para obtener un ejemplo, vea Ejemplos de serialización XML.
Asignación de tipo de datos XSD
El documento W3C titulado Esquema XML Parte 2: Tipos de datos especifica los tipos de datos simples que se permiten en un esquema del lenguaje de definición de esquemas XML (XSD). Para muchos de estos (por ejemplo, int y decimal), hay un tipo de datos correspondiente en .NET. Sin embargo, algunos tipos de datos XML no tienen un tipo de datos .NET correspondiente, por ejemplo, el tipo de datos NMTOKEN . En tales casos, si usa la herramienta definición de esquema XML (Herramienta de definición de esquema XML (Xsd.exe)) para generar clases a partir de un esquema, se aplica un atributo adecuado a un miembro de la cadena de tipo y su propiedad DataType se establece en el nombre del tipo de datos XML. Por ejemplo, si un esquema contiene un elemento denominado "MyToken" con el tipo de datos XML NMTOKEN, la clase generada podría contener un miembro como se muestra en el ejemplo siguiente.
<XmlElement(DataType:="NMTOKEN")> _
Public MyToken As String
[XmlElement(DataType = "NMTOKEN")]
public string MyToken;
Del mismo modo, si va a crear una clase que debe ajustarse a un esquema XML específico (XSD), debe aplicar el atributo adecuado y establecer su propiedad DataType en el nombre de tipo de datos XML deseado.
Para obtener una lista completa de asignaciones de tipos, consulte la propiedad DataType para cualquiera de las siguientes clases de atributo: