What is the best approach for serializing BigDecimal/BigInteger to ProtocolBuffers

java, protocol-buffers

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());
  }

Problem

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?

Original source