2017-07-19 1 views
1

ProtoBufを優先してDataContractSerializerから移行しています。以前に気づいたことの1つは、XMLシリアライザでDataContractのIsReference =trueを使用することによって大きな影響があったことです。ProtoBufでAsReferenceDefault = trueを使用した場合のパフォーマンスへの影響

ProtoContractAsReferenceDefault = trueを使用して何らかの参考情報があるかどうかをご確認したいと思います。

シリアライズ/デシリアライズの速度にどのような影響がありますか?シリアライズされるものにどのような影響がありますか?

1つのオブジェクトへのすべての参照がIsReference = trueであるか、または主なもの(実際にオブジェクトを所有するもの、オブジェクトを直列化すると予想される場所)を持つことは必須ですか? IsReference = falseであり、同じオブジェクトのインスタンスがまだ1つだけですか?

答えて

1

このフラグは、物事の数に変更:

  • シリアライズ、それはこのようにマークされ、すべてのオブジェクトに対して、それはすでにそれを見ているかどうかを確認するために、参照のルックアップをチェックする必要があることを意味します。 特に、であるべきではありませんが、余分な作業が必要です。
  • 追加の抽象レイヤーを作成する必要があります。基本的には、既存のオブジェクトIDまたは新しいオブジェクトID +オブジェクトペイロード(これはbcl.protoから1(既存のオブジェクト)またはフィールド210(新規オブジェクト)が設定されています)のbcl.protoからNetObjectProxyという形になりました。これはリファレンスごとに少しのスペースしか必要としませんが、オブジェクトの繰り返しのシリアライズよりもスペースが少なくなります。
  • この余分なレイヤーは他の実装では消費するのが少し面倒です(ただし不可能ではありません)。本質的にコアprotobuf APIにはオブジェクトIDの概念がないため、これはライブラリ固有の追加です。あなたがprotobuf-netを使っているなら、あなたはすばらしいはずです。

現実的にどのようになっているかは、シナリオによって異なります。私はあなたの発見を聞きたいと思います。

再あなたがAsReferenceを必要とする:それはAsReferenceDefaultを経由して指定されていない場合、それはあなたが参照トラッキングがを発生することが予想されるすべてのメンバーで指定する必要があります。小切手は個々のメンバーレベルで適用されます(実際のコードではありません)。

bool asRef = member.AsReferenceSpecified() 
    ? member.AsReference : metaType.AsReferenceDefault; 
+0

ありがとうございます、私は試してみます(その違いをどうやって確認するか分かりません)。シリアライザ全体のAsReferenceを指定する方法はありますか?また、私はルートノードが 'AsReferenceDefault'としてマークされても、それに応じて直列化されることはないという感覚を持っています。私のテストによれば、それはいつも異なる基準です。これは期待される行動ですか? – J4N

関連する問題