¿Cuál es el mejor enfoque para serializar BigDecimal / BigInteger a ProtocolBuffers?
-
20-08-2019 - |
Pregunta
Estoy empezando a migrar un mecanismo de serialización personalizado a Protocol Buffers. Un tipo de datos que se utilizará de manera particularmente regular es BigDecimal
.
¿Alguien sabe de una buena manera de serializar esto dentro de Protocol Buffers? Nuestra rutina de serialización actual utiliza BigDecimal.toPlainString()
para la serialización y new BigDecimal(String)
para la deserialización. Supongo que hay una mejor manera.
Mi conjetura es definir un BigInteger
como:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
Pero no estoy muy seguro de cómo definir toByteArray()
- ¿quizás usando su método <=>?
Solución
Sí Debe definir BigInteger como BigInteger.toByteArray ().
Creo que BigDecimal sería:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
mientras BigInteger puede definirse como
message BInteger {
required bytes value = 1;
}
El código para manejar BigInteger sería:
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());
}
Otros consejos
¿Por qué quieres cambiarlo? Solo porque puede o existe una necesidad real (como una sesión de creación de perfiles que confirma que la serialización / deserialización lleva la mayor parte del tiempo).
Usaría una cadena, solo porque está integrada :)
El enfoque de matriz de bytes propuesto ( ¿Cuál es el mejor enfoque para serializar BigDecimal / BigInteger to ProtocolBuffers ) me parece bien, si la representación de cadenas parece ser un problema.