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

StackOverflow https://stackoverflow.com/questions/1051732

  •  20-08-2019
  •  | 
  •  

Вопрос

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

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

Я предполагаю, что нужно определить BigDecimal как:

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top