Was ist der beste Ansatz BigDecimal / BigInteger zu Protocol Buffers für die Serialisierung
-
20-08-2019 - |
Frage
Ich beginne eine benutzerdefinierte Serialisierung Mechanismus Protocol Buffers zu migrieren. Ein Datentyp, der verwendet wird, besonders regelmäßig ist BigDecimal
.
Kennt jemand eine gute Möglichkeit, dies zu Serialisierung innerhalb Protocol Buffers? Unsere aktuelle Serialisierung Routine verwendet BigDecimal.toPlainString()
für die Serialisierung und new BigDecimal(String)
für die Deserialisierung -. Ich gehe davon aus, es gibt einen besseren Weg,
Meine Vermutung ist ein BigDecimal
zu definieren:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
Aber ich bin nicht sicher, wie BigInteger
definieren - vielleicht seine toByteArray()
Methode mit
Lösung
Ja. Sie sollten BigInteger als BigInteger.toByteArray definieren ().
Meine Vermutung ist, dass BigDecimal wäre:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
während BigInteger als
definiert werden
message BInteger {
required bytes value = 1;
}
Der Code BigInteger zu handhaben wäre:
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());
}
Andere Tipps
Warum wollen Sie es ändern? Gerade weil Sie können, oder gibt es einen echten Bedarf (wie eine Profilierungs Sitzung bestätigt, dass die Serialisierung / Deserialisierung den größten Teil der Zeit in Anspruch nimmt).
Ich würde eine Zeichenfolge verwenden, nur weil es eingebaut ist:)
Der vorgeschlagene Byte-Array-Ansatz ( Was ist der beste Ansatz BigDecimal / BigInteger zu Protocol Buffers für die Serialisierung ) scheint mich in Ordnung, wenn String-Darstellung scheint ein Problem zu sein.