Microsoft se ha dado cuenta de la importancia de los datos serializados, por lo que ha incluido el espacio de nombres System.Runtime.Serialization y System.Xml.Serialization en el marco .NET para proporcionar funciones de serialización y brindar a los usuarios la capacidad de escribir sus propios métodos de serialización. . El espacio de nombres System.Xml.Serialization proporciona métodos básicos para serializar un objeto en formato XML. Echemos un vistazo a cómo utilizar este método.
El encanto de XML
XML serializado se refiere al proceso de guardar los campos públicos y atributos de un objeto en un formato serial (aquí, formato XML) para facilitar el almacenamiento o la transmisión. La deserialización es el proceso de utilizar información del estado de serie para restaurar un objeto desde su estado XML de serie a su estado original. Por lo tanto, puede pensar en la serialización como un método para guardar el estado de un objeto en una secuencia o búfer.
El propósito de la serialización es el almacenamiento y la conversión de datos. El almacenamiento de datos se refiere a guardar datos entre sesiones de usuario. Cuando se cierra la aplicación, los datos se guardan (serializan) y cuando el usuario regresa, los datos se recargan (se deserializan). La conversión de datos se refiere a transformar datos a un formato que pueda ser entendido por otro sistema. Utilizando serialización y XML, la conversión de datos se puede realizar fácilmente.
Los datos del objeto pueden ser una clase, un método, una propiedad, un tipo privado, una matriz o incluso un XML incrustado en un objeto System.Xml.XmlElement o System.Xml.XmlAttribute.
La clase clave en el espacio de nombres System.Xml.Serialization es XmlSerializer. Por supuesto, este espacio de nombres también incluye otras clases relacionadas con otros aspectos de XML y SOAP, pero nos centramos en la clase XmlSerializer.
XmlSerializador
La clase XmlSerializer proporciona métodos para serializar objetos en archivos XML y deserializar documentos XML en objetos. También permite a los usuarios especificar cómo se convierten los objetos a XML. Puede pasar el tipo de objeto a serializar como parámetro al constructor de la clase. El siguiente código C# ilustra el uso del constructor.
XmlSerializer ser = new XmlSerializer(typeof(objectToSerialize));
El siguiente es el código VB.NET equivalente:
Dim ser As New XmlSerializer(GetType(objectToSerialize))
El proceso de serialización real se implementa en el método Serialize de la clase XmlSerializer. Este método permite llamar a objetos TextWriter, Stream y XmlWriter durante la serialización. El siguiente código de ejemplo ilustra cómo llamar a este método. En este ejemplo, un objeto se serializa y se guarda en un archivo en el disco local. El ejemplo comienza con la declaración de clase, seguida del código fuente serializado.
usando Sistema;
espacio de nombres BuilderSerialization {
Dirección de clase pública {
Dirección pública() {}
cadena pública Dirección1;
cadena pública Dirección2;
cadena pública Ciudad;
Estado de cadena pública;
Zip de cadena pública;
cadena pública País;
} }
usando Sistema;
espacio de nombres BuilderSerialization {
Autor de clase pública {
Autor público() { }
cadena pública Nombre;
cadena pública Segundo nombre;
cadena pública Apellido;
Título de cadena pública;
cadena pública Género;
objeto de dirección de dirección pública;
} }
espacio de nombres BuilderSerialization {
Libro de clase pública {
Libro público() { }
Título de cadena pública;
Autor público AutorObjeto;
ISBN de cadena pública;
precio minorista doble público;
editor de cadena pública;
}}
usando Sistema;
usando System.Xml.Serialization;
usando System.IO;
espacio de nombres BuilderSerialization {
clase Clase de prueba {
vacío estático Principal (cadena [] argumentos) {
Libro LibroObjeto = nuevo Libro();
XmlSerializer ser = nuevo XmlSerializer (tipo de (Libro));
Escritor TextWriter = new StreamWriter("booktest.xml");
BookObject.Title = "LotusScript práctico";
BookObject.ISBN = "1884777767 ";
BookObject.Publisher = "Publicaciones de Manning";
BookObject.RetailPrice = 43,95;
BookObject.AuthorObject = nuevo Autor();
BookObject.AuthorObject.FirstName = "Tony";
BookObject.AuthorObject.LastName = "Patton";
BookObject.AuthorObject.Gender = "Hombre";
BookObject.AuthorObject.AddressObject = nueva dirección();
BookObject.AuthorObject.AddressObject.Address1 = "1 calle principal";
BookObject.AuthorObject.AddressObject.City = "En cualquier lugar";
BookObject.AuthorObject.AddressObject.State = "KY";
BookObject.AuthorObject.AddressObject.Zip = "40000";
BookObject.AuthorObject.AddressObject.Country = "EE.UU.";
ser.Serialize(escritor, BookObject);
escritor.Close();
} } }
El código anterior convierte tres objetos en uno, generando así un archivo XML durante el proceso de serialización. El siguiente es el documento XML generado por el programa de ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<Libro xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
<Title>LotusScript práctico</Title>
<ObjetoAutor>
<Nombre>Tony</Nombre>
<Apellido>Patton</Apellido>
<Género>Hombre</Género>
<Objeto de dirección>
<Dirección1>1 calle principal</Dirección1>
<Ciudad>En cualquier lugar</Ciudad>
<Estado>KY</Estado>
<Zip>40000</Zip>
<País>EE.UU.</País>
</ObjetoDirección>
</AuthorObject>
<ISBN>1884777767</ISBN>
<PrecioRetail>43.95</PrecioRetail>
<Editor>Publicaciones Manning</Editor>
</Book>
Tenga en cuenta que el proceso de serialización también puede manejar el anidamiento de datos de objetos. Los datos se convierten a un formato reconocible, lo que facilita la recarga de datos (deserialización) y la transferencia de datos a otro sistema. Durante el proceso de transferencia de datos, el sistema receptor necesita conocer el formato del archivo XML (si no lo sabe de antemano). Por lo tanto, es necesario proporcionar un archivo de esquema XML. La herramienta XSD.exe en .NET Framework puede generar un archivo de esquema para XML serializado.
El siguiente es un código de ejemplo escrito en VB.NET:
Dirección de clase pública
Dirección pública1 como cadena
Dirección pública2 como cadena
Ciudad pública como cadena
Estado público como cadena
Zip público como cadena
País público como cadena
Fin de clase
Autor de clase pública
Nombre público como cadena
Segundo nombre público como cadena
Apellido público como cadena
Título público como cadena
Género público como cadena
Objeto de dirección pública como dirección
Fin de clase
Libro de clase pública
AutorObjeto público como autor
Título público como cadena
ISBN público como cadena
Precio minorista público como el doble
Editor público como cadena
Fin de clase
Importaciones System.Xml.Serialización
ImportacionesSystem.IO
Módulo Módulo1
Subprincipal()
Atenuar BookObject como libro nuevo
Dim ser como nuevo XmlSerializer (GetType (libro))
Escritor tenue como nuevo StreamWriter ("booktest.xml")
Con objeto libro
.Title = "LotusScript práctico"
.ISBN = "1884777767 "
.Publisher = "Publicaciones Manning"
.Precio minorista = 43,95
.AuthorObject = Nuevo Autor
.AuthorObject.FirstName = "Tony"
.AuthorObject.Apellido = "Patton"
.AuthorObject.Gender = "Hombre"
.AuthorObject.AddressObject = Nueva Dirección
.AuthorObject.AddressObject.Address1 = "1 calle principal"
.AuthorObject.AddressObject.City = "En cualquier lugar"
.AuthorObject.AddressObject.State = "KY"
.AuthorObject.AddressObject.Zip = "40000"
.AuthorObject.AddressObject.Country = "EE.UU."
Terminar con
ser.Serialize(escritor, BookObject)
escritor.Cerrar()
Subtítulo final
Salida de control
del módulo final
El proceso de serialización genera archivos XML estándar y los miembros de datos se convierten en elementos XML. Sin embargo, no todos los miembros de datos se convierten en elementos. Puede controlar el archivo XML de salida agregando algunas etiquetas en el código de la clase. De esta manera, los miembros de datos pueden convertirse en atributos XML en lugar de elementos, o simplemente ignorarse. El siguiente ejemplo es un código VB.NET de clase de libro modificado.
Libro de clase pública
AutorObjeto público como autor
Título público como cadena
<System.Xml.Serialization.XmlAttribute()> _
ISBN público como cadena
<System.Xml.Serialization.XmlIgnoreAttribute()> _
Precio minorista público como el doble
Editor público como cadena
Fin de clase
Este código le indica al sistema que utilice el ISBN del miembro de la clase como atributo XML al generar el archivo XML e ignore el miembro RetailPrice. Este cambio se puede ver en el archivo XML generado:
<?xml version="1.0" encoding="utf-8"?>
<Libro xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance " ISBN="1884777767 ">
<ObjetoAutor>
<Nombre>Tony</Nombre>
<Apellido>Patton</Apellido>
<Género>Hombre</Género>
<Objeto de dirección>
<Dirección1>1 calle principal</Dirección1>
<Ciudad>En cualquier lugar</Ciudad>
<Estado>KY</Estado>
<Zip>40000</Zip>
<País>EE.UU.</País>
</ObjetoDirección>
</AuthorObject>
<Title>LotusScript práctico</Title>
<Editor>Publicaciones Manning</Editor>
</Book>
El siguiente es el código C# correspondiente:
public class Book {
Libro público() { }
Título de cadena pública;
Autor público AutorObjeto;
[System.Xml.Serialization.XmlAttribute()]
ISBN de cadena pública;
[System.Xml.Serialization.XmlIgnoreAttribute()]
precio minorista doble público;
editor de cadena pública;
}
Lo anterior sólo menciona brevemente dos símbolos de marcado. Consulte la documentación de .NET para obtener la notación de marcado completa.
La deseriaización de datos deserializados se puede lograr fácilmente llamando al método Deserialize de la clase XmlSerializer. El siguiente fragmento de programa VB.NET completa la deserialización del documento XML mencionado anteriormente:
Dim BookObject As New Book
Dim ser como nuevo XmlSerializer (GetType (libro))
Dim fs como nuevo System.IO.FileStream("booktest.xml", FileMode.Open)
Lector oscuro como nuevo System.XML.XmlTextReader(fs)
BookObject = CType(ser.Deserialize(reader), Book)
Este programa coloca los datos del resultado en la memoria para su uso posterior. Aquí está el código C# equivalente:
XmlSerializer ser = new XmlSerializer(typeof(Book));
System.IO.FileStreamfs = nuevo System.IO.FileStream("booktest.xml",
ModoArchivo.Abrir);
Lector System.Xml.XmlTextReader = nuevo System.Xml.XmlTextReader(fs);
Libro LibroObjeto = (Libro)(ser.Deserialize(lector));
-------------------------------------------------- -
Sobre el autor: Tony Patton es un desarrollador de aplicaciones profesional con amplios conocimientos y está certificado en Java, VB, Lotus y XML.