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?

Was it helpful?

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top