javaprotocol-buffers

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


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