Каков наилучший подход для сериализации BigDecimal / BigInteger в ProtocolBuffers - PullRequest
22 голосов
/ 27 июня 2009

Я начинаю мигрировать пользовательский механизм сериализации в буфер протоколов. Один тип данных, который будет использоваться особенно регулярно - BigDecimal.

Кто-нибудь знает хороший способ сериализации этого в пределах буферов протокола? Наша текущая процедура сериализации использует BigDecimal.toPlainString() для сериализации и new BigDecimal(String) для десериализации - я предполагаю, что есть лучший способ.

Я предполагаю определить BigDecimal как:

message BDecimal {
    required int32 scale = 1;
    required BInteger int_val = 2;
}

Но я не слишком уверен, как определить BigInteger - возможно, используя его toByteArray() метод?

Ответы [ 2 ]

15 голосов
/ 27 июня 2009

Да. Вы должны определить BigInteger как BigInteger.toByteArray ().

Я предполагаю, что BigDecimal будет:


message BDecimal {
  required int32 scale = 1;
  required BInteger int_val = 2;
}

, тогда как BigInteger может быть определен как


message BInteger {
  required bytes value = 1;
}

Код для обработки BigInteger будет:


  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());
  }
0 голосов
/ 28 июня 2009

Почему вы хотите изменить это? Просто потому, что вы можете или есть реальная необходимость (например, сеанс профилирования, подтверждающий, что сериализация / десериализация занимает большую часть времени).

Я бы использовал строку только потому, что она встроена:)

Предложенный подход с байтовым массивом ( Что является лучшим подходом для сериализации BigDecimal / BigInteger к ProtocolBuffers ) мне кажется подходящим, если представление строки представляется проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...