Introducir la serialización XMLIntroducing XML Serialization

La serialización es el proceso de convertir un objeto a un formulario que pueda transportarse fácilmente.Serialization is the process of converting an object into a form that can be readily transported. Por ejemplo, puede serializar un objeto y transportarlo a través de Internet utilizando http entre un cliente y un servidor.For example, you can serialize an object and transport it over the Internet using HTTP between a client and a server. El otro fin para el cual sirve es que la deserialización reconstruye el objeto desde la secuencia.On the other end, deserialization reconstructs the object from the stream.

La serialización XML serializa solo los campos públicos y los valores de propiedad de un objeto en una secuencia XML.XML serialization serializes only the public fields and property values of an object into an XML stream. La serialización XML no incluye información de tipo.XML serialization does not include type information. Por ejemplo, si tiene un objeto Book que existe en el espacio de nombres Library, no hay garantía de que se deserialice en un objeto del mismo 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 serialización XML no convierte los métodos, indizadores, campos privados ni propiedades (excepto las colecciones de solo lectura).XML serialization does not convert methods, indexers, private fields, or read-only properties (except read-only collections). Para serializar todos los campos y propiedades, tanto públicos como privados, de un objeto, utilice el DataContractSerializer en vez de la serialización XML.To serialize all an object's fields and properties, both public and private, use the DataContractSerializer instead of XML serialization.

La clase central en serialización XML es la clase XmlSerializer, y los métodos más importantes de esta clase son Serialize y 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. XmlSerializer crea los archivos C# y los compila en archivos .dll para realizar esta serialización.The XmlSerializer creates C# files and compiles them into .dll files to perform this serialization. En .NET Framework 2.0, la herramienta Generador de serializador XML (Sgen.exe) está diseñada para generar de antemano estos ensamblados de serialización para implementarlos con la aplicación y mejorar el rendimiento de inicio.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. La secuencia XML generada por el XmlSerializer es compatible con el World Wide Web Consortium (W3C) lenguaje de definición de esquemas XML (XSD) 1.0 recomendación.The XML stream generated by the XmlSerializer is compliant with the World Wide Web Consortium (W3C) XML Schema definition language (XSD) 1.0 recommendation. Además, los tipos de datos generados son compatibles con el documento titulado "esquema XML parte 2: Tipos de datos."Furthermore, the data types generated are compliant with the document titled "XML Schema Part 2: Datatypes."

Los datos de los objetos se describen mediante construcciones de lenguaje de programación, como clases, campos, propiedades, tipos primitivos, matrices e incluso XML insertado en forma de objetos 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. Existe la opción de crear clases propias, anotadas con atributos, o de utilizar la herramienta de definición de esquema XML para generar las clases de acuerdo con un documento de esquema XML existente.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.

Si se dispone de un esquema XML, es posible ejecutar la herramienta de definición de esquema XML con el fin de generar un conjunto de clases fuertemente tipadas para el esquema y que se anoten con atributos.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. Cuando se serializa una instancia de este tipo de clase, el XML generado se adhiere al Esquema XML.When an instance of such a class is serialized, the generated XML adheres to the XML Schema. Contando con este tipo de clase, se puede programar con un modelo de objetos manipulados con facilidad estando asegurado que el XML generado cumple el esquema 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. Esta es una alternativa al uso de otras clases en .NET Framework, como las clases XmlReader y XmlWriter, para analizar y escribir una secuencia 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. Para obtener más información, vea XML Documents and Data (Documentos y datos XML).For more information, see XML Documents and Data. Estas clases le permiten analizar cualquier secuencia XML.These classes allow you to parse any XML stream. En contraste, use XmlSerializer cuando se espera que la secuencia XML cumpla con un esquema XML conocido.In contrast, use the XmlSerializer when the XML stream is expected to conform to a known XML Schema.

Los atributos controlan la secuencia XML generada por la clase XmlSerializer, lo que le permite establecer el espacio de nombres XML, el nombre de elemento, el nombre de atributo, etc., de la secuencia 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. Para obtener más información sobre estos atributos y la forma en que controlan la serialización XML, vea Controlling XML Serialization Using Attributes (Controlar la serialización XML mediante atributos).For more information about these attributes and how they control XML serialization, see Controlling XML Serialization Using Attributes. Para consultar una tabla de los atributos que se usan para controlar el XML generado, vea Attributes That Control XML Serialization (Atributos que controlan la serialización XML).For a table of those attributes that are used to control the generated XML, see Attributes That Control XML Serialization.

La clase XmlSerializer puede serializar adicionalmente un objeto y generar una secuencia XML SOAP codificada.The XmlSerializer class can further serialize an object and generate an encoded SOAP XML stream. El XML generado cumple las normas de la sección 5 del documento de World Wide Web Consortium con título "Protocolo simple de acceso a objetos (SOAP) 1.1" (SOAP).The generated XML adheres to section 5 of the World Wide Web Consortium document titled "Simple Object Access Protocol (SOAP) 1.1." Para obtener más información sobre este proceso, consulte Cómo: Serializar un objeto como un Stream XML codificados en SOAP.For more information about this process, see How to: Serialize an Object as a SOAP-Encoded XML Stream. Para consultar una tabla de los atributos que controlan el XML generado, vea Attributes That Control Encoded SOAP Serialization (Atributos que controlan la serialización SOAP codificada).For a table of the attributes that control the generated XML, see Attributes That Control Encoded SOAP Serialization.

La clase XmlSerializer genera los mensajes SOAP creados por servicios Web XML y pasados a estos.The XmlSerializer class generates the SOAP messages created by, and passed to, XML Web services. Para controlar los mensajes SOAP, puede aplicar los atributos a las clases, los valores devueltos, parámetros y campos situados en un archivo de servicio 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). Puede utilizar ambos, los atributos mostrados en "atributos que controlan la serialización XML" y los “atributos que controlan la serialización de SOAP codificada” porque un servicio Web XML puede utilizar o el estilo SOAP literal o codificado.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. Para obtener más información sobre cómo usar atributos para controlar el XML generado por un servicio Web XML, vea XML Serialization with XML Web Services (Serialización XML con servicios 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. Para obtener más información acerca de los servicios Web XML y SOAP, vea personalizar el formato de mensaje SOAP.For more information about SOAP and XML Web services, see Customizing SOAP Message Formatting.

Consideraciones de seguridad para aplicaciones XmlSerializerSecurity Considerations for XmlSerializer Applications

Si crea una aplicación que usa la clase XmlSerializer, debería conocer los siguientes puntos y sus implicaciones:When creating an application that uses the XmlSerializer, you should be aware of the following items and their implications:

  • 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 esas 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

    Estos ensamblados de serialización se pueden generar de antemano y firmar utilizando la herramienta SGen.exe.These serialization assemblies can be generated in advance and signed by using the SGen.exe tool. Esta no es la causa del funcionamiento de ningún servidor de servicio Web.This does not work a server of Web services. En otras palabras, solo está para el uso del cliente y para la serialización manual.In other words, it is only for client use and for manual serialization.

    El código y las DLL son vulnerables a un proceso malintencionado en el momento de creación y compilación.The code and the DLLs are vulnerable to a malicious process at the time of creation and compilation. Al utilizar un equipo que ejecuta Microsoft Windows NT 4.0 o posterior, podría ser posible que dos o más usuarios compartan el directorio 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. Es peligroso compartir un directorio TEMP si las dos cuentas tienen privilegios de seguridad diferentes y la cuenta con privilegios más altos ejecuta una aplicación mediante 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. En este caso, un usuario puede incumplir la seguridad del equipo reemplazando o el archivo .cs o .dll que está compilado.In this case, one user can breach the computer's security by replacing either the .cs or .dll file that is compiled. Para eliminar esta preocupación, siempre asegurarse de que cada cuenta en el equipo tiene su propio perfil.To eliminate this concern, always be sure that each account on the computer has its own profile. De forma predeterminada, la variable de entorno TEMP señala a un directorio diferente para cada cuenta.By default, the TEMP environment variable points to a different directory for each account.

  • Si un usuario malintencionado envía una secuencia continua de datos XML a un servidor web (un ataque por denegación de servicio), XmlSerializer sigue procesando los datos hasta que el equipo se quede sin recursos.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.

    Este tipo de ataque se elimina si se está utilizando un equipo que ejecuta Internet Information Services (IIS), y su aplicación se está ejecutando dentro de 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 representa una puerta que no procesa secuencias que sean más largas que la cantidad fija (el valor predeterminado es 4 KB).IIS features a gate that does not process streams longer than a set amount (the default is 4 KB). Si crea una aplicación que no usa IIS y deserializa con XmlSerializer, debería implementar una puerta similar que evite un ataque por denegación de servicio.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 serializa los datos y ejecuta código mediante el uso de cualquier tipo que se le dé.The XmlSerializer serializes data and runs any code using any type given to it.

    Hay dos maneras en las que un objeto malintencionado representa una amenaza.There are two ways in which a malicious object presents a threat. Podría ejecutar software malintencionado o insertarlo en el archivo de C# creado por XmlSerializer.It could run malicious code or it could inject malicious code into the C# file created by the XmlSerializer. En el primer caso, si un objeto malintencionado intenta ejecutar un procedimiento destructivo, la seguridad de acceso del código ayuda a evitar que se haga cualquier daño.In the first case, if a malicious object tries to run a destructive procedure, code access security helps prevent any damage from being done. En el segundo caso, existe la posibilidad de que un objeto malintencionado inserte de algún modo código en el archivo de C# creado por 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. Aunque se ha examinado este problema completamente, y este tipo de ataque está considerado improbable, debería tomar la precaución de nunca serializar los datos con un tipo desconocido y de poca confianza.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.

  • Los datos confidenciales serializados podrían ser vulnerables.Serialized sensitive data might be vulnerable.

    Después de la XmlSerializer haya serializado los datos, puede almacenarse como un archivo XML u otro almacén de datos.After the XmlSerializer has serialized data, it can be stored as an XML file or other data store. Si su almacén de datos está disponible para otros procesos, o está visible en una intranet o Internet, los datos se pueden robar y utilizar malévolamente.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. Por ejemplo, si se crea una aplicación que serializa órdenes, que incluyen la tarjeta de crédito, los datos son muy sensibles.For example, if you create an application that serializes orders that include credit card numbers, the data is highly sensitive. Para ayudar a evitar esto, siempre proteja el almacén para que sus datos y los pasos de la toma lo mantenga privado.To help prevent this, always protect the store for your data and take steps to keep it private.

Serialización de una clase simpleSerialization of a Simple Class

El ejemplo de código siguiente muestra una clase básica con un campo público.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;
}

Cuando se serializa una instancia de esta clase, se podría parecer a lo siguiente.When an instance of this class is serialized, it might resemble the following.

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

Para obtener más ejemplos de serialización, vea Examples of XML Serialization (Ejemplos de serialización XML).For more examples of serialization, see Examples of XML Serialization.

Elementos que se pueden serializarItems That Can Be Serialized

Los elementos siguientes se pueden serializar mediante la clase XmLSerializer:The following items can be serialized using the XmLSerializer class:

  • Las propiedades de lectura y escritura públicas y campos de clases públicas.Public read/write properties and fields of public classes.

  • Las clases que implementan ICollection o IEnumerable.Classes that implement ICollection or IEnumerable.

    Nota

    Solo se serializan las colecciones, no las propiedades públicas.Only collections are serialized, not public properties.

  • Los objetos XmlElement.XmlElement objects.

  • Los objetos XmlNode.XmlNode objects.

  • Los objetos DataSet.DataSet objects.

Para obtener más información sobre la serialización o deserialización de objetos, vea Cómo: Serializar un objeto y Cómo: Deserializar un objeto.For more information about serializing or deserializing objects, see How to: Serialize an Object and How to: Deserialize an Object.

Ventajas de utilizar serialización XMLAdvantages of Using XML Serialization

El XmlSerializer clase proporciona un control completo y flexible al serializar un objeto como XML.The XmlSerializer class gives you complete and flexible control when you serialize an object as XML. Si está creando un servicio Web XML, puede aplicar atributos que controlan la serialización a las clases y miembros para asegurarse que el resultado de XML cumple con un esquema concreto.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.

Por ejemplo, XmlSerializer permite hacer lo siguiente:For example, XmlSerializer enables you to:

  • Especifique si un campo o propiedad debería estar codificada como un atributo o un elemento.Specify whether a field or property should be encoded as an attribute or an element.

  • Especifique un espacio de nombres XML para utilizar.Specify an XML namespace to use.

  • Especifique el nombre de un elemento o atributo si un campo o el nombre de propiedad es impropio.Specify the name of an element or attribute if a field or property name is inappropriate.

Otra ventaja de serialización XML es que no tiene ninguna restricción en las aplicaciones que desarrolla, con tal de que la secuencia XML que se genera cumpla con un esquema determinado.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. Imagine un esquema que se utiliza para describir los libros.Imagine a schema that is used to describe books. Representa un título, autor, publicador y un elemento de número ISBN.It features a title, author, publisher, and ISBN number element. Puede desarrollar una aplicación que procesa los datos XML como usted desee, por ejemplo, como una orden de libro o como un inventario de libros.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. En cualquier caso, el único requisito es que la secuencia XML cumple con el esquema del lenguaje de definición de esquemas XML (XSD) especificado.In either case, the only requirement is that the XML stream conforms to the specified XML Schema definition language (XSD) schema.

Consideraciones de la serialización XMLXML Serialization Considerations

Al usar la clase XmlSerializer, debe tener en cuenta lo siguiente:The following should be considered when using the XmlSerializer class:

  • La herramienta Sgen.exe está diseñada expresamente para generar los ensamblados de serialización para rendimiento óptimo.The Sgen.exe tool is expressly designed to generate serialization assemblies for optimum performance.

  • Los datos serializados contienen solo los datos mismos y la estructura de sus clases.The serialized data contains only the data itself and the structure of your classes. La identidad del tipo y la información del ensamble no están incluidas.Type identity and assembly information are not included.

  • Solo se pueden serializar los campos y las propiedades públicas.Only public properties and fields can be serialized. Las propiedades deben ser de acceso público (métodos get y set).Properties must have public accessors (get and set methods). Si debe serializar datos no públicos, use la clase DataContractSerializer en lugar de la serialización XML.If you must serialize non-public data, use the DataContractSerializer class rather than XML serialization.

  • Una clase debe tener un constructor sin parámetros para serializar XmlSerializer.A class must have a parameterless constructor to be serialized by XmlSerializer.

  • Los métodos no pueden serializarse.Methods cannot be serialized.

  • XmlSerializer puede procesar clases que implementan de manera diferente IEnumerable o ICollection si cumplen ciertos requisitos, como se indica a continuación.XmlSerializer can process classes that implement IEnumerable or ICollection differently if they meet certain requirements, as follows.

    Una clase que implementa IEnumerable debe implementar un método Add público que requiere un solo parámetro.A class that implements IEnumerable must implement a public Add method that takes a single parameter. El parámetro del método Add debe ser coherente (polimórfico) con el tipo devuelto por la propiedad IEnumerator.Current devuelta por el método 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 clase que implementa ICollection además de IEnumerable (como CollectionBase) debe tener una propiedad indexada pública Item (un indexador en C#) que toma un número entero y debe tener una propiedad pública Count de 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. El parámetro pasado al método Add debe ser del mismo tipo que aquel que devuelve la propiedad Item, o una de las bases de dicho 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.

    Para las clases que implementan ICollection, los valores que se van a serializar se recuperan de la propiedad Item indexada, en lugar de mediante una llamada a GetEnumerator.For classes that implement ICollection, values to be serialized are retrieved from the indexed Item property rather than by calling GetEnumerator. Además, no se serializan los campos públicos y propiedades, con la excepción de los campos públicos que devuelven otra clase de colección (uno que implemente ICollection).Also, public fields and properties are not serialized, with the exception of public fields that return another collection class (one that implements ICollection). Para ver un ejemplo, vea Examples of XML Serialization (Ejemplos de serialización XML).For an example, see Examples of XML Serialization.

Asignación de tipo de datos XSDXSD Data Type Mapping

El documento del W3C titulado XML Schema Part 2: Los tipos de datos especifica los tipos de datos simples que se permiten en un esquema (XSD) del lenguaje de definición de esquemas XML.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. Para muchos de estos (por ejemplo, int y decimal), hay un tipo de datos correspondiente en .NET Framework.For many of these (for example, int and decimal), there is a corresponding data type in the .NET Framework. Pero algunos tipos de datos XML no tienen un tipo de datos correspondiente en .NET Framework (por ejemplo, el tipo de datos NMTOKEN).However, some XML data types do not have a corresponding data type in the .NET Framework (for example, the NMTOKEN data type). En casos como este, si usa la 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 cadena de tipo y su propiedad DataType se establee en el nombre del tipo de datos 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. 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.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;

De igual forma, si está creando una clase que debe cumplir un esquema XML (XSD) concreto, debe aplicar el atributo adecuado y establecer su propiedad DataType en el nombre del tipo de datos XML deseado.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.

Para obtener una lista completa de asignaciones de tipo, vea la propiedad DataType para cualquiera de las clases de atributos siguientes:For a complete list of type mappings, see the DataType property for any of the following attribute classes:

Vea tambiénSee also