在协议缓冲区中表示System.Decimal的最佳方法是什么?

Cam*_*and 14 .net c# floating-point protocol-buffers

这个问题之后,在协议缓冲区中表示System.Decimal对象的最佳方法是什么?

Mar*_*ell 7

那么,protobuf-net将为您处理这个问题; 它运行类型的属性,并完全支持decimal.由于decimal在proto中没有直接的表达方式,它不会(当前)decimal从".proto"文件生成属性,但是识别一些常见类型("BCL.Decimal"或类似的)将是一个很好的调整.并将其解释为十进制.

至于代表它 - 我在protobuf-net wiki区域有一个关于这个(现在我怀疑已过时)的讨论文件 ; 现在有一个protobuf-net的工作版本,它只是为你做的.

毫无疑问,乔恩和我将在今天晚些时候更多地解决这个问题;-p

这个(在.proto中)的protobuf-net版本就像(从这里):

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
}
Run Code Online (Sandbox Code Playgroud)

  • 我猜这不是便携式的?(我如何轻松地从 C# 编写此消息并在例如 linux 上从 java/C++ 读取它,反之亦然)? (3认同)

Jon*_*eet 5

我和Marc的计划非常模糊,想出一个“公共PB消息”库,这样您就可以以一种通用的方式表示相当普通的类型(日期/时间和十进制会立即出现),并且可以在.NET和Java中进行转换(以及任何其他人想贡献的东西)。

如果您乐意坚持使用.NET,并且正在寻找紧凑型产品,那么我可能会选择类似以下的内容:

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;
}
Run Code Online (Sandbox Code Playgroud)

该符号可以仅用exponent_and_sign的符号表示,指数是绝对值。

将尾数的两个部分都设为可选意味着0的表示非常紧凑(但仍区分0m和0.0000m等)。如果我们真正想要的话,exponent_and_sign也可以是可选的。

我不了解Marc的项目,但是在我的港口我生成了部分类,因此您可以将System.Decimal和Protobuf.Common.Decimal(或其他)之间的转换放入部分类中。