35

カスタムのシリアライゼーション メカニズムを Protocol Buffers に移行し始めています。特に定期的に使用される 1 つのデータ型はBigDecimal.

Protocol Buffers内でこれをシリアル化する良い方法を知っている人はいますか? 現在のシリアライゼーション ルーチンはBigDecimal.toPlainString()、シリアライゼーションとnew BigDecimal(String)デシリアライゼーションに使用しています。もっと良い方法があると思います。

私の推測では、 a を次のように定義しますBigDecimal

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

しかし、定義方法がよくわかりませんBigInteger-おそらくそのtoByteArray()メソッドを使用していますか?

4

3 に答える 3

25

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

私の推測では、 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());
  }
于 2009-06-27T03:25:57.850 に答える
0

なぜ変更したいのですか?本当の必要性がある、または必要があるという理由だけで(プロファイリングセッションの確認など、シリアライゼーション/デシリアライゼーションにほとんどの時間がかかります)。

文字列が組み込まれているという理由だけで、文字列を使用します:)

文字列表現が問題であると思われる場合、提案されたバイト配列アプローチ(BigDecimal/BigInteger を ProtocolBuffers にシリアル化するための最良のアプローチは何ですか)は私には問題ないようです。

于 2009-06-28T10:02:49.513 に答える