Compartir a través de


Control de la serialización XML mediante atributos

Los atributos se pueden usar para controlar la serialización XML de un objeto o para crear una secuencia XML alternativa a partir del mismo conjunto de clases. Para obtener más información sobre cómo crear una secuencia XML alternativa, vea How to: Specify an Alternate Element Name for an XML Stream.

Nota:

Si el XML generado debe cumplir la sección 5 del documento World Wide Web Consortium (W3C) titulado Simple Object Access Protocol (SOAP) 1.1, use los atributos enumerados en Atributos que controlan la serialización SOAP codificada.

De forma predeterminada, el nombre de un elemento XML viene determinado por la clase o el nombre de miembro. En una clase denominada Book, un campo denominado ISBN generará una etiqueta de <ISBN>elemento XML, como se muestra en el ejemplo siguiente:

Public Class Book
    Public ISBN As String
End Class
' When an instance of the Book class is serialized, it might
' produce this XML:
' <ISBN>1234567890</ISBN>.
public class Book
{
    public string ISBN;
}
// When an instance of the Book class is serialized, it might
// produce this XML:
// <ISBN>1234567890</ISBN>.

El comportamiento predeterminado se puede cambiar si desea asignar un nuevo nombre al elemento. En el código siguiente se muestra cómo un atributo habilita esta funcionalidad estableciendo la ElementName propiedad de un XmlElementAttribute objeto:

Public Class TaxRates
   < XmlElement(ElementName = "TaxRate")> _
    Public ReturnTaxRate As Decimal
End Class
public class TaxRates {
    [XmlElement(ElementName = "TaxRate")]
    public decimal ReturnTaxRate;
}

Para obtener más información sobre los atributos, vea Atributos. Para obtener una lista de atributos que controlan la serialización XML, vea Atributos que controlan la serialización XML.

Control de la serialización de matrices

Los XmlArrayAttribute atributos y XmlArrayItemAttribute controlan la serialización de matrices. Con estos atributos, puede controlar el nombre del elemento, el espacio de nombres y el tipo de datos esquema XML (XSD), tal como se define en el documento W3C titulado Esquema XML Parte 2: Tipos de datos. También puede especificar los tipos que se pueden incluir en una matriz.

XmlArrayAttribute determinará las propiedades del elemento XML envolvente que da como resultado cuando se serializa una matriz. Por ejemplo, de forma predeterminada, serializar la matriz siguiente dará como resultado un elemento XML denominado Employees. El elemento Employees contendrá una secuencia de elementos nombrados según el tipo de matriz Employee.

Public Class Group
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String
End Class
public class Group {
    public Employee[] Employees;
}
public class Employee {
    public string Name;
}

Una instancia serializada podría parecerse al código siguiente:

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</Employees>
</Group>

Al aplicar un XmlArrayAttribute, puede cambiar el nombre del elemento XML, como se indica a continuación:

Public Class Group
    <XmlArray("TeamMembers")> _
    Public Employees() As Employee
End Class
public class Group {
    [XmlArray("TeamMembers")]
    public Employee[] Employees;
}

El XML resultante podría parecerse al código siguiente:

<Group>
<TeamMembers>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</TeamMembers>
</Group>

Por XmlArrayItemAttribute otro lado, controla cómo se serializan los elementos contenidos en la matriz.

Nota:

El atributo se aplica al campo que devuelve la matriz.

Public Class Group
    <XmlArrayItem("MemberName")> _
    Public Employee() As Employees
End Class
public class Group {
    [XmlArrayItem("MemberName")]
    public Employee[] Employees;
}

El XML resultante podría parecerse al código siguiente:

<Group>
<Employees>
    <MemberName>Haley</MemberName>
</Employees>
</Group>

Serialización de clases derivadas

Otro uso de XmlArrayItemAttribute es permitir la serialización de clases derivadas. Por ejemplo, otra clase denominada Manager que deriva de Employee se puede agregar al ejemplo anterior. Si no aplica el XmlArrayItemAttribute, se producirá un error durante la ejecución porque no se reconocerá el tipo de la clase derivada. Para solucionar este resultado, aplique el atributo dos veces, cada vez que establezca la Type propiedad para cada tipo aceptable (base y derivado).

Public Class Group
    <XmlArrayItem(Type:=GetType(Employee)), _
    XmlArrayItem(Type:=GetType(Manager))> _
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String
End Class
Public Class Manager
Inherits Employee
    Public Level As Integer
End Class
public class Group {
    [XmlArrayItem(Type = typeof(Employee)),
    XmlArrayItem(Type = typeof(Manager))]
    public Employee[] Employees;
}
public class Employee {
    public string Name;
}
public class Manager:Employee {
    public int Level;
}

Una instancia serializada podría parecerse al código siguiente:

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
    <Employee xsi:type = "Manager">
        <Name>Ann</Name>
        <Level>3</Level>
    </Employee>
</Employees>
</Group>

Serialización de una matriz como una secuencia de elementos

También puede serializar una matriz como una secuencia plana de elementos XML aplicando un XmlElementAttribute al campo que devuelve la matriz de la siguiente manera:

Public Class Group
    <XmlElement> _
    Public Employees() As Employee
End Class
public class Group {
    [XmlElement]
    public Employee[] Employees;
}

Una instancia serializada podría parecerse al código siguiente:

<Group>
<Employees>
    <Name>Haley</Name>
</Employees>
<Employees>
    <Name>Noriko</Name>
</Employees>
<Employees>
    <Name>Marco</Name>
</Employees>
</Group>

Otra manera de diferenciar los dos flujos XML es usar la herramienta de definición de esquema XML para generar los archivos de documento del esquema XML (XSD) a partir del código compilado. Para obtener más información sobre el uso de la herramienta, vea La herramienta de definición de esquemas XML y la serialización XML. Cuando no se aplica ningún atributo al campo, el esquema describe el elemento de la siguiente manera:

<xs:element minOccurs="0" maxOccurs ="1" name="Employees" type="ArrayOfEmployee" />

XmlElementAttribute Cuando se aplica al campo , el esquema resultante describe el elemento de la siguiente manera:

<xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" />

Serialización de un ArrayList

La ArrayList clase puede contener una colección de diversos objetos. Por lo tanto, puede usar un ArrayList de manera similar a como usa una matriz. Sin embargo, en lugar de crear un campo que devuelva una matriz de objetos tipados, puede crear un campo que devuelva un único ArrayList. Sin embargo, al igual que con las matrices, debe especificar a XmlSerializer los tipos de objetos que ArrayList contiene. Para ello, asigne varias instancias del XmlElementAttribute al campo , como se muestra en el ejemplo siguiente.

Public Class Group
    <XmlElement(Type:=GetType(Employee)), _
    XmlElement(Type:=GetType(Manager))> _
    Public Info As ArrayList
End Class
public class Group {
    [XmlElement(Type = typeof(Employee)),
    XmlElement(Type = typeof(Manager))]
    public ArrayList Info;
}

Control de la serialización de clases mediante XmlRootAttribute y XmlTypeAttribute

Puede aplicar dos atributos solo a una clase: XmlRootAttribute y XmlTypeAttribute. Estos atributos son similares. se XmlRootAttribute puede aplicar solo a una clase: la clase que, cuando se serializa, representa el elemento de apertura y cierre del documento XML, es decir, el elemento raíz. Por XmlTypeAttribute otro lado, se puede aplicar a cualquier clase, incluida la clase raíz.

Por ejemplo, en los ejemplos anteriores, la Group clase es la clase raíz y todos sus campos públicos y propiedades se convierten en los elementos XML que se encuentran en el documento XML. Por lo tanto, solo puede tener una clase raíz. Al aplicar el XmlRootAttribute, puede controlar el flujo XML generado por el XmlSerializer. Por ejemplo, puede cambiar el nombre del elemento y el espacio de nombres.

XmlTypeAttribute permite controlar el esquema del XML generado. Esta funcionalidad es útil cuando necesita publicar el esquema a través de un servicio web XML. En el ejemplo siguiente, se aplican tanto XmlTypeAttribute como XmlRootAttribute a la misma clase.

<XmlRoot("NewGroupName"), _
XmlType("NewTypeName")> _
Public Class Group
    Public Employees() As Employee
End Class
[XmlRoot("NewGroupName")]
[XmlType("NewTypeName")]
public class Group {
    public Employee[] Employees;
}

Si se compila esta clase y se usa la herramienta definición de esquema XML para generar su esquema, encontrará el siguiente XML que describe Group:

<xs:element name="NewGroupName" type="NewTypeName" />

Por el contrario, si tuviera que serializar una instancia de la clase , solo NewGroupName se encontraría en el documento XML:

<NewGroupName>
    . . .
</NewGroupName>

Impedir la serialización con XmlIgnoreAttribute

Es posible que se produzca una situación en la que no sea necesario serializar una propiedad pública o un campo. Por ejemplo, se podría usar un campo o una propiedad para contener metadatos. En tales casos, aplique el XmlIgnoreAttribute al campo o la propiedad, y el XmlSerializer lo omitirá.

Consulte también