BigDecimal/BigInteger を ProtocolBuffers にシリアル化するための最良のアプローチは何ですか?
-
20-08-2019 - |
質問
カスタムのシリアル化メカニズムをプロトコル バッファーに移行し始めています。特に定期的に使用されるデータ型の 1 つは次のとおりです。 BigDecimal
.
プロトコルバッファ内でこれをシリアル化する良い方法を知っている人はいますか?現在のシリアル化ルーチンでは、 BigDecimal.toPlainString()
連載用、そして new BigDecimal(String)
逆シリアル化については、もっと良い方法があると思います。
私の推測では、 BigDecimal
として:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
しかし、どう定義すればいいのかよくわかりません BigInteger
- おそらくそれを使用しています toByteArray()
方法?
解決
はい。あなたはBigInteger.toByteArray()としてのBigIntegerを定義する必要があります。
私の推測では、BigDecimalのは可能だろうということです。
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
のBigIntegerが
のように定義されてもよいです
message BInteger {
required bytes value = 1;
}
のBigIntegerを処理するコードは以下のようになります:
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());
}
他のヒント
なぜ変更したいのですか?それができる、または実際のニーズがあるという理由だけで(プロファイリングセッションでシリアル化/逆シリアル化にほとんどの時間がかかることを確認するなど)。
組み込まれているという理由だけで、私は文字列を使用します:)
提案されたバイト配列アプローチ (BigDecimal/BigInteger を ProtocolBuffers にシリアル化するための最良のアプローチは何ですか?) 文字列表現が問題であると思われる場合は、私には問題ないようです。
所属していません StackOverflow