Каков наилучший подход для сериализации BigDecimal/BigInteger для ProtocolBuffers

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

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

Мое предположение - определить BigDecimal как:

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

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

Ответы

Ответ 1

Да. Вы должны определить 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());
  }

Ответ 2

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

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

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