Каков наилучший подход для сериализации 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), кажется мне хорошим, если представление строк кажется проблемой.