Quelle est la meilleure approche pour sérialiser BigDecimal / BigInteger en ProtocolBuffers?

StackOverflow https://stackoverflow.com/questions/1051732

  •  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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top