What is the best approach for serializing BigDecimal/BigInteger to ProtocolBuffers
-
20-08-2019 - |
Question
I am starting to migrate a custom serialization mechanism to Protocol Buffers. One data type that will be used particularly regularly is BigDecimal
.
Does anyone know of a good way of serializing this within Protocol Buffers? Our current serialization routine uses BigDecimal.toPlainString()
for serialization, and new BigDecimal(String)
for deserialization - I'm assuming there's a better way.
My guess is to define a BigDecimal
as:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
But I am not too sure how to define BigInteger
- perhaps using its toByteArray()
method?
Solution
Yes. You should define BigInteger as BigInteger.toByteArray() .
My guess is that BigDecimal would be:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
while BigInteger may be defined as
message BInteger {
required bytes value = 1;
}
The code to handle BigInteger would be:
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());
}
OTHER TIPS
Why do you want to change it? Just because you can or is there a real need (like a profiling session confirming, that serialization/deserialization takes most of the time).
I would use a string, just because it is built in :)
The proposed byte array approach (What is the best approach for serializing BigDecimal/BigInteger to ProtocolBuffers) seems fine to me, if string representation seems to be an issue.