Quelle est la meilleure approche pour sérialiser BigDecimal / BigInteger en ProtocolBuffers?
-
20-08-2019 - |
Question
Je commence à migrer un mécanisme de sérialisation personnalisé vers les tampons de protocole. Un type de données qui sera utilisé particulièrement régulièrement est BigDecimal
.
Est-ce que quelqu'un connaît un bon moyen de sérialiser cela dans les tampons de protocole? Notre routine de sérialisation actuelle utilise BigDecimal.toPlainString()
pour la sérialisation et new BigDecimal(String)
pour la désérialisation - je suppose qu'il existe un meilleur moyen.
Mon hypothèse est de définir un BigInteger
comme:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
Mais je ne sais pas trop comment définir toByteArray()
- peut-être en utilisant sa <=> méthode?
La solution
Oui. Vous devez définir BigInteger comme BigInteger.toByteArray ().
Je pense que BigDecimal serait:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
alors que BigInteger peut être défini comme
message BInteger {
required bytes value = 1;
}
Le code pour gérer BigInteger serait:
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());
}
Autres conseils
Pourquoi voulez-vous le changer? Tout simplement parce que vous pouvez ou avez un besoin réel (comme une session de profilage confirmant, la sérialisation / désérialisation prend la plupart du temps).
Je voudrais utiliser une chaîne, juste parce qu'elle est intégrée à:)
L’approche tableau par octets proposée ( Quelle est la meilleure approche pour sérialiser BigDecimal / BigInteger en ProtocolBuffers ) me semble bien, si la représentation des chaînes semble poser problème.