martes, 21 de julio de 2009

Convertir tus objetos en XML directamente

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étodo Deserialize para cargar el objeto de negocio a partir de un String.
  • Si cambiamos las referencias al objeto System.IO.StringWriter por un System.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

1 comentario:

  1. Por decir, que mi Business Object (BO), tenga como propiedad otro BO (aparte de otras propiedades que pudiera tener), Y este segundo BO tuviera sus propias propiedades...

    Cómo seria el resultado del xml??

    ResponderEliminar