Text Entity Serializer

Serializador de Entidades en formato texto.

Dejo este snippet por si a alguno le puede ser de utilidad.

Resuelve el problema de guardar una lista de entidades (resultados de una búsqueda, una consulta, etc.) en un archivo de texto, con un delimitador.

Muy a pesar de muchos, aun siguen habiendo proyectos en los que es necesario trabajar con este formato en lugar de usar xml.

La idea es usar la reflexión para serializar los textos que se usarán para las cabeceras, y a partir de ahí, los valores de los campos.

Es una clase genérica, expone entre otras cosas un método

public string Serialize(List<T> items)

Lo primero que hacemos en este método es obtener el tipo de T.

Type objectType = typeof(T);

Es bien sabido que para trabajar con cadenas, es más óptimo usar la clase StringBuilder

StringBuilder outPut = new StringBuilder();

Para crear los encabezados,  recorremos las propiedades públicas del tipo, y escribimos su nombre

// Escribir Encabezados
/* GetProperties() devuelve las propiedades públicas de la clase */
foreach (PropertyInfo item in objectType.GetProperties())
{
    outPut.Append(item.Name);
    outPut.Append(_fieldSeparator);
}
outPut.Append(_rowSeparator);

el siguiente paso, será escribir los valores de las propiedades de cada uno de los items recibidos en la llamada al método:

// Escribir Valores
foreach (T item in items)
{
    foreach (PropertyInfo propertyItem in objectType.GetProperties())
    {
        // Obtenemos el valor del campo
        object value = propertyItem.GetValue(item, null);
        if(value!=null)
        {
            // Escribir valor del campo
            outPut.Append(value.ToString());
        }else{
            // Escribir cadena que representa valor nulo
            outPut.Append(_nullString);
        }
        // Escribir separador de campos
        outPut.Append(_fieldSeparator);
    }
    // Escribir separador de registros
    outPut.Append(_rowSeparator);
}

Y.. finalmente, devolver la cadena generada, que podremos escribir en un fichero

// Valor de retorno
return outPut.ToString();

Por supuesto, creamos una sobrecarga para escribir lo generado en un archivo:

public string Serialize(List<T> items, string fileName)

Y... lo escribimos con un StreamWriter

// Creamos instancia del Writer
// El using permitirá que se liberen los recursos del sistema
// en caso de error, a la vez que se propaga la excepción
using (StreamWriter sw = new StreamWriter(fileName))
{
    // Escribimos
    sw.Write(textToWrite);
    // Cerramos Fichero
    sw.Close();
}

Y voilá. Ya tenemos todo lo necesario.

Cómo usar la clase?

// Buscamos clientes de Madrid
List<Cliente> resultados = BuscarClientes("Madrid");
// Instanciamos el serializador
TextSerializer<Cliente> clientesSerializer = new TextSerializer<Cliente>();
// Guardamos el archivo. Lo creamos con la extensión xls para poder
// verlo con el Excel, que es más cómodo
clientesSerializer.Serialize(resultados, "Clientes_Madrid.xls");

image

Y ya que estamos: Dejo este otro snippet para serializar la misma lista de entidades, pero en formato xml.

// Serializar los resultados a xml
using (FileStream fs = new FileStream("Clientes_Madrid.xml", FileMode.Create))
{
    System.Xml.Serialization.XmlSerializer xs = new XmlSerializer(typeof(List<Cliente>));
    xs.Serialize(fs, resultados);
    fs.Close();
}

image 

Comments

No Comments