En algunas ocasiones es necesario guardarse un objeto en su estado actual con todas sus propiedades por ejemplo para guardar en un fichero log, o para transferir por algún protocolo que sólo admite texto, etc.
En casos como estos suele ser muy práctico utilizar las clases de serialización que vienen nativas en el Framework.net
.
Imaginad que tenemos la típica clase Persona que representa un objeto de negocio de nuestra aplicación:
1: Public Class Persona
2:
3: Private _Nombre As String
4: Private _Apellidos As String
5:
6: Public Property Nombre() As String
7: Get
8: Return _Nombre
9: End Get
10: Set(ByVal value As String)
11: _Nombre = value
12: End Set
13: End Property
14:
15: Public Property Apellidos() As String
16: Get
17: Return _Apellidos
18: End Get
19: Set(ByVal value As String)
20: _Apellidos = value
21: End Set
22: End Property
23:
24: Sub New()
25: Me.Nombre = String.Empty
26: Me.Apellidos = String.Empty
27: End Sub
28:
29: End Class
Para pasar un objeto de esta clase a String necesitamos utilizar las clases System.Xml.Serialization.XmlSerializer
y System.IO.StringWriter
de la siguiente forma:
1: Dim PersonaSerializada As String
2: Dim Yo As New Persona()
3: Yo.Nombre = "Yo"
4: Yo.Apellidos = "Mismo"
5:
6: Using sw As New StringWriter()
7: Dim serialitzador As New XmlSerializer(GetType(Persona))
8: serialitzador.Serialize(sw, Yo)
9: PersonaSerializada = sw.ToString()
10: End Using
Y el resultado que tendríamos sería:
<?xml version="1.0" encoding="utf-16"?> <Persona xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Nombre>Yo</Nombre> <Apellidos>Mismo</Apellidos> </Persona>
Este es un método práctico y rápido para guardar el estado de un objeto en un momento concreto y puede ser muy útil tanto para poder realizar trazas de un procedimiento concreto o para montar un sistema de gestión de excepciones avanzado .. imaginad que cada vez que se produce una excepción tratando un objeto de negocio nos guardamos la información de la excepción y además el objeto entero.
A tener en cuenta:
- El objeto
System.Xml.Serialization.XmlSerializer
también incluye el métodoDeserialize
para cargar el objeto de negocio a partir de unString
. - Si cambiamos las referencias al objeto
System.IO.StringWriter
por unSystem.IO.StreamWriter
podemos guardar el objeto serializado en un fichero XML directamente. - Los procesos de serialización suelen tener un coste elevado para el sistema así que es conveniente utilizarlo en entornos donde no prime el rendimiento de la aplicación … ¿existe hoy día algún sitio donde no sea imprescindible el rendimiento? .. :-P