将 BigDecimal/BigInteger 序列化为 ProtocolBuffers 的最佳方法是什么
-
20-08-2019 - |
题
我开始将自定义序列化机制迁移到协议缓冲区。一种特别经常使用的数据类型是 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 的最佳方法是什么)对我来说似乎很好,如果字符串表示似乎是一个问题。
不隶属于 StackOverflow