El otro día, buscando serializadores eficientes para Ocell, me encontré con esta pequeña maravilla del código: Migrant. Lo que más me llamó la atención no es lo que más publicitan en su repositorio (el soporte de serialización de grafos complejos de objetos), sino su serializador generado.

Para serializar datos (guardar un objeto de  memoria a un archivo), lo más rápido es la serialización binaria. Es, por así decirlo, como volcar los bits de memoria al archivo tal y como están. Ahora bien, hay un problema: ¿qué pasa cuando queremos guardar objetos diferentes? Hay que guardar en el archivo información de qué tipo de objeto es y qué campos tiene. El deserializador tiene que encargarse de leer esos datos y generar el objeto en memoria, normalmente usando Reflection, un proceso bastante lento. La principal ventaja es que no es necesario escribir un (de)serializador para cada tipo de objeto que vayamos a guardar. A cambio perdemos en velocidad.

Migrant coge un enfoque mixto. Al serializar un objeto, lo que hace es generar un serializador binario específico para esa clase, usando System.Reflection.Emit. Por así decirlo, programa automáticamente el serializador, lo carga como si fuese una clase que hayas escrito normalmente y es lo que usa para serializar. Los resultados son bestiales: es rapidísimo en cuanto vayamos a serializar colecciones grandes.

Es una verdadera lástima que no pueda usar System.Reflection.Emit en Windows Phone, porque Migrant me vendría genial.  Es muy, muy original y además extremadamente fácil de usar. Merece la pena no perderle de vista.