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