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.
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….pbLos 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 datos | Huella en el nombre de archivo | Versión del ensamblado | |
|---|---|---|---|
| Ámbito de la invalidación | Solo los informes cuyo contrato ha cambiado | Solo los informes cuyo contrato ha cambiado | Todos los datos, en cada publicación |
| Almacenamiento admitido | Cualquiera | Solo archivos | Cualquiera |
| Implementación | Almacenar y comparar una cadena | Componer el nombre del archivo | Una línea en la clave de caché |
| Datos residuales | Ninguno | Requiere eliminar los archivos obsoletos | Ninguno |
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
- El SDK .NET de Dinaup: funcionamiento del modelo tipado y procedimiento de regeneración de MyDinaup.
- LoadAllRowsAsync: carga de un informe completo en una sola llamada.
- Referencia del SDK .NET: firmas y ejemplos.