Qual é a melhor abordagem para a serialização BigDecimal / BigInteger para ProtocolBuffers
-
20-08-2019 - |
Pergunta
Eu estou começando a migrar um mecanismo de serialização personalizada para Protocol Buffers. Um tipo de dados que será usado particularmente regularmente é BigDecimal
.
Alguém sabe de uma boa maneira de serialização isso dentro Protocol Buffers? Nossa serialização atual usos de rotina BigDecimal.toPlainString()
para serialização e new BigDecimal(String)
para desserialização -. Estou assumindo que há uma maneira melhor
Meu palpite é definir um BigDecimal
como:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
Mas eu não estou muito certo como definir BigInteger
-? Talvez usando seu método toByteArray()
Solução
Sim. Você deve definir BigInteger como BigInteger.toByteArray ().
Meu palpite é que BigDecimal seria:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
enquanto BigInteger pode ser definida como
message BInteger {
required bytes value = 1;
}
O código para lidar com BigInteger seria:
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());
}
Outras dicas
Por que você quer mudar isso? Apenas porque você pode ou há uma necessidade real (como uma sessão de perfil confirmando, que serialização / desserialização leva a maior parte do tempo).
Gostaria de usar uma corda, só porque ele é construído em:)
A abordagem proposta matriz de bytes ( Qual é a melhor abordagem para a serialização BigDecimal / BigInteger para ProtocolBuffers ) parece-me muito bem, se representação de cadeia parece ser um problema.