Dinaup 2027 ya está llegando: agentes de IA, stock por almacén y todo más rápido. Descubre las novedades →
DinaupBlog
← Volver al blog

Mejora de compatibilidad con Protocol Buffers

Las clases de fila generadas por MyDinaup utilizan una numeración de campos estable e incorporan la constante SchemaHash. Afecta a las aplicaciones que serializan filas con Protocol Buffers.

Equipo Dinaup8 de julio de 20264 min de lectura

Se aplica a: aplicaciones que serializan con Protocol Buffers las clases de fila (_RowC) generadas por MyDinaup, por ejemplo para almacenarlas en disco, en Redis o en una cola de mensajes.

Si su aplicación no serializa filas, este cambio no requiere ninguna acción.

Resumen

Las clases de fila generadas por MyDinaup incluyen atributos de Protocol Buffers. El SDK no los utiliza: la respuesta del servidor se resuelve por nombre de columna y no por número de campo. Estos atributos están disponibles para las aplicaciones cliente que necesiten serializar las filas por su cuenta.

Esta versión introduce dos cambios en la generación de dichas clases y corrige un error.

Novedades

Numeración de campos estable

Anteriormente, el número asignado a cada ProtoMember se derivaba de la posición de la columna dentro del informe. En determinados escenarios, esa posición podía variar entre generaciones. A partir de esta versión, los campos se ordenan por el identificador de la columna, que permanece invariable.

Constante SchemaHash

Cada clase de fila expone una constante SchemaHash que contiene una huella SHA256 del contrato completo: número, nombre y tipo de cada campo.

string hash = Reports.PrincipalesD.VentasC.Ventas_RowC.SchemaHash;

El valor cambia únicamente cuando cambia el contrato de esa clase.

Correcciones

Al eliminar una columna de un informe, las filas podían recibir valores de texto nulos, lo que provocaba un error en la deduplicación interna de cadenas. Las propiedades de texto se inicializan ahora con una cadena vacía.

Cambio importante

Agregar o quitar columnas sigue desplazando el número de los campos posteriores. Invalide los datos serializados cada vez que genere MyDinaup. Si no lo hace, los datos existentes se interpretarán con la numeración nueva y los valores se asignarán a campos incorrectos sin que se produzca ninguna excepción.

Acciones recomendadas

Genere MyDinaup y actualice el paquete

Suba la versión del paquete {Empresa}.MyDinaup en su proyecto.

Invalide los datos serializados con la versión anterior

Esta operación debe realizarse una sola vez, en el momento de adoptar la nueva versión.

Implemente una estrategia de invalidación

Elija una de las estrategias descritas a continuación para las generaciones futuras.

Estrategias de invalidación

Invalidación selectiva mediante SchemaHash

Almacene la huella junto con los datos y compárela en la lectura. Solo se descarta la caché de los informes cuyo contrato haya cambiado.

// Al guardar
var paquete = new CacheDeInforme {
    SchemaHash = Reports.PrincipalesD.VentasC.Ventas_RowC.SchemaHash,
    Filas      = informe.Rows
};

// Al leer
if (paquete.SchemaHash != Reports.PrincipalesD.VentasC.Ventas_RowC.SchemaHash)
    paquete = null;   // El contrato ha cambiado: se descartan los datos.

Invalidación mediante el nombre de archivo

Si los datos se conservan en archivos, incluya la huella en el nombre. Al cambiar el contrato, la aplicación no encuentra el archivo correspondiente y lo regenera, sin necesidad de leer ni comparar nada.

string archivo = $"ventas_{Reports.PrincipalesD.VentasC.Ventas_RowC.SchemaHash}.pb";
// ventas_9c1f….pb

Los archivos generados con contratos anteriores permanecen en disco. Elimínelos periódicamente seleccionando el patrón ventas_*.pb y descartando el nombre vigente.

Invalidación global mediante la versión del ensamblado

Obtenga por reflexión la versión del ensamblado de MyDinaup e inclúyala en la clave de caché. Cada publicación del paquete cambia la versión y, por lo tanto, invalida todos los datos anteriores.

// Puede utilizarse cualquier tipo del ensamblado de MyDinaup.
string version = typeof(Reports).Assembly.GetName().Version!.ToString();
string clave   = $"informe-ventas::{version}";

Comparación

SchemaHash en los datosHuella en el nombre de archivoVersión del ensamblado
Ámbito de la invalidaciónSolo los informes cuyo contrato ha cambiadoSolo los informes cuyo contrato ha cambiadoTodos los datos, en cada publicación
Almacenamiento admitidoCualquieraSolo archivosCualquiera
ImplementaciónAlmacenar y comparar una cadenaComponer el nombre del archivoUna línea en la clave de caché
Datos residualesNingunoRequiere eliminar los archivos obsoletosNinguno

Todas las estrategias son válidas. Se recomienda SchemaHash, en los datos o en el nombre del archivo, cuando la reconstrucción de la caché tenga un coste significativo.

Preguntas más frecuentes

Recursos relacionados

Sigue leyendo