当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在协议缓冲区中表示System.Decimal的最佳方法是什么?》经验,为你挑选了2个好方法。

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



1> Marc Gravell..:

那么,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
}



2> Jon Skeet..:

我和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;
}

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

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

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

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有