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");
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();
}