Настоящий программист любит open-source как родственную душу и любит Microsoft как грязную, но удовлетворяющую проститутку
Да. Вы должны определить 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 ) кажется мне нормальным, если строковое представление кажется проблемой.