我开始将自定义序列化机制迁移到协议缓冲区。一种特别经常使用的数据类型是 BigDecimal.

有谁知道在协议缓冲区中序列化这个的好方法?我们当前的序列化例程使用 BigDecimal.toPlainString() 用于序列化,以及 new BigDecimal(String) 对于反序列化 - 我假设有更好的方法。

我的猜测是定义一个 BigDecimal 作为:

message BDecimal {
    required int32 scale = 1;
    required BInteger int_val = 2;
}

但我不太确定如何定义 BigInteger - 也许使用它的 toByteArray() 方法?

有帮助吗?

解决方案

是。你应该定义的BigInteger作为BigInteger.toByteArray()。

我的猜测是BigDecimal的将是:


message BDecimal {
  required int32 scale = 1;
  required BInteger int_val = 2;
}

而BigInteger的可被定义为


message BInteger {
  required bytes value = 1;
}

要处理的BigInteger的代码将是:


  BInteger write(BigInteger val) {
    BInteger.Builder builder = BInteger.newBuilder();
    ByteString bytes = ByteString.copyFrom(val.toByteArray());
    builder.setValue(bytes);
    return builder.build();
  }

  BigInteger read(BInteger message) {
    ByteString bytes = message.getValue();
    return new BigInteger(bytes.toByteArray());
  }

其他提示

为什么要改变它?只是因为您可以或者确实有需要(例如分析会话确认,序列化/反序列化花费了大部分时间)。

我会使用字符串,只是因为它是内置的:)

提议的字节数组方法(将 BigDecimal/BigInteger 序列化为 ProtocolBuffers 的最佳方法是什么)对我来说似乎很好,如果字符串表示似乎是一个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top