2009-06-26 8 views
15

カスタムシリアル化メカニズムをプロトコルバッファに移行し始めています。特に定期的に使用される1つのデータ型はBigDecimalです。BigDecimal/BigIntegerをProtocolBuffersにシリアライズする最良の方法は何ですか

プロトコルバッファ内でこれをシリアル化する良い方法を知っている人はいますか?現在のシリアライゼーションルーチンでは、シリアライゼーションにはBigDecimal.toPlainString()が使用され、デシリアライズには新しいBigDecimal(String)が使用されています。

私の推測では、とのBigDecimalを定義することです:

message BDecimal { 
    required int32 scale = 1; 
    required BInteger int_val = 2; 
} 

しかし、私はBigIntegerのを定義する方法があまりにもわからない - おそらくそのtoByteArray()メソッドを使用していますか?

答えて

10

はい。 BigIntegerはBigInteger.toByteArray()として定義する必要があります。

私の推測では、BigDecimalのは可能だろうということです。


message BDecimal { 
    required int32 scale = 1; 
    required BInteger int_val = 2; 
} 

のBigIntegerはBigIntegerのを処理するコードは次のようになり


message BInteger { 
    required bytes value = 1; 
} 

として定義されてもよい:


    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()); 
    } 
+2

BigDecimalをBigIntegerとスケールに変換するにはどうすればよいですか?帰ってきた ? – stikkos

+1

私は最初、 'toByteArray'を使うこのアプローチが移植性がないかもしれないと懸念していました(Java以外の言語から意味のないものを直列化することはできません - 最初はprotobufを使う主な理由の1つです)。しかし、['BigInteger.toByteArray'](http://docs.oracle.com/javase/6/docs/api/java/math/BigInteger.html#toByteArray())の仕様は非常に具体的であり、他の言語(例:[.net BigInteger](http://msdn.microsoft.com/en-us/library/dd268207(v = vs.110).aspx)。エンディアンが存在するように見えるので注意が必要です異なる)。 – bacar

1

あなたはなぜそれを変更したいですか?あなたが本当に必要なことがある、または必要である(プロファイリングセッションの確認のように、シリアライゼーション/デシリアライゼーションが大部分を占める)ことができるからです。

私はそれが内蔵されてからといって、文字列を使用します:)

文字列表現が問題であると思われる場合は、提案されたバイト配列のアプローチ(What is the best approach for serializing BigDecimal/BigInteger to ProtocolBuffersが)、私には罰金です。

+2

私はそれがパフォーマンスの最適化ではなくネットワーク最適化の問題だと考えます。文字列には多くのメモリが必要です。例えば、Integer.MAX_VALUE(2147483647)では、文字列として24バイトのオーダーが必要ですが、バイト配列としては8バイトしか必要ありません。 – notnoop

関連する問題