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 tu 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. Eso 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. Invalida los datos serializados cada vez que generes MyDinaup. Si no lo haces, los datos existentes se interpretan con la numeración nueva. Los valores se asignan a campos incorrectos sin que se produzca ninguna excepción.

Acciones recomendadas

Genera MyDinaup y actualiza el paquete

Sube la versión del paquete {Empresa}.MyDinaup en tu proyecto.

Invalida los datos serializados con la versión anterior

Hazlo una sola vez, al adoptar la nueva versión.

Implementa una estrategia de invalidación

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

Estrategias de invalidación

Invalidación selectiva mediante SchemaHash

Almacena la huella junto con los datos y compárala 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, incluye 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ínalos periódicamente seleccionando el patrón ventas_*.pb y descartando el nombre vigente.

Invalidación global mediante la versión del ensamblado

Obtén por reflexión la versión del ensamblado de MyDinaup e inclúyela 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