views:

490

answers:

2

Hi

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?

Any ideas or pointers would be greatly appreciated!

Cheers

Rich

+1  A: 

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

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 (http://stackoverflow.com/questions/1051732/what-is-the-best-approach-for-serializing-bigdecimal-biginteger-to-protocolbuffer/1052049#1052049) seems fine to me, if string representation seems to be an issue.

squiddle
I assume that it's a network optimization problem rather than performance optimization. String requires a lot of memory. Integer.MAX_VALUE (2147483647) for example requires in the order of 24 bytes as a string but only 8 bytes as byte array.
notnoop