c# - protobuffers - protocol buffer list
¿Cuál es la mejor manera de representar System.Decimal en Protocol Buffers? (3)
Bueno, protobuf-net simplemente manejará esto por ti; se ejecuta fuera de las propiedades de los tipos, y tiene soporte completo para decimal
. Como no existe una forma directa de expresar decimal
en proto, no generará (actualmente) una propiedad decimal
de un archivo ".proto", pero sería una buena modificación reconocer algún tipo común ("BCL.Decimal" o similar) e interpretarlo como decimal.
En cuanto a representarlo, tuve un documento de discusión sobre esto (ahora desactualizado, sospecho) en el área wiki de protobuf-net; ahora hay una versión funcional en protobuf-net que simplemente lo hace por usted.
Sin duda, Jon y yo lo haremos más tarde hoy ;-p
La versión de protobuf-net de esto (en .proto) es algo así como (desde aquí ):
message Decimal {
optional uint64 lo = 1; // the first 64 bits of the underlying value
optional uint32 hi = 2; // the last 32 bis of the underlying value
optional sint32 signScale = 3; // the number of decimal digits, and the sign
}
A partir de esta pregunta, ¿cuál sería la mejor manera de representar un objeto System.Decimal en un buffer de protocolo?
Marc y yo tenemos planes muy vagos para crear una biblioteca de "mensajes PB comunes", de modo que puedas representar tipos bastante comunes (fecha / hora y decimales al instante en la mente) de una manera común, con conversiones disponibles en .NET y Java. (y cualquier otra cosa que alguien quiera contribuir).
Si está contento de seguir con .NET, y está buscando compacidad, posiblemente vaya con algo como:
message Decimal {
// 96-bit mantissa broken into two chunks
optional uint64 mantissa_msb = 1;
optional uint32 mantissa_lsb = 2;
required sint32 exponent_and_sign = 3;
}
El signo solo puede ser representado por el signo de exponente_y_sign, siendo el exponente el valor absoluto.
Hacer que ambas partes de la mantisa sean opcionales significa que 0 se representa de manera muy compacta (pero aún diferenciando entre 0m y 0.0000m, etc.). exponent_and_sign también podría ser opcional si realmente quisiéramos.
No sé sobre el proyecto de Marc, pero en mi puerto genero clases parciales, así que puedes poner una conversión entre System.Decimal y Protobuf.Common.Decimal (o lo que sea) en la clase parcial.
Arreglé un parche para protobuf-csharp-port con ganchos que genera clases protobuf con estructuras nativas Decimal y DateTime. En lo que respecta al formato de cable, están representados por dos mensajes proto "incorporados".
Aquí está el enlace: https://code.google.com/p/protobuf-csharp-port/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby = & sort = & id = 78