2017-08-09 6 views
0

ProtoContractプロパティの相違点 - AsReferenceDefaultProtoMemberAttributeプロパティAsReferenceとは何ですか?Protbuf-net:ProtoMemberAttribute.AsReferenceとProtoContract.AsReferenceDefaultの相違点は何ですか

wiki通り:

AsReference - サブオブジェクトの参照追跡を可能にします。これは と非常に異なるシリアル化レイアウトを使用しますが、その オブジェクトを1回だけシリアル化します(参照用に一意のトークンを与えます)。これにより、 循環グラフのフルグラフサポートが可能になります。 AsReferenceDefaultを:これはまた、効率的にそう はデータ

で何度も繰り返されているが、どのようにそれがProtoContract財産に関係ない共通の文字列を格納するのに大きな効果を を使用することができますか?

たとえば、AsReferenceDefaultをtrueに設定すると、ProtoMemberAttributeのプロパティAsReferenceは不要になりますか?

答えて

2

はい、AsReferenceDefaultがクラスに適用されている場合、対応するプロパティがをProtoMemberAttributeに宣言していなくても、常に参照としてシリアル化されます。

理想的には、大きなクラスの場合、オブジェクトが大きいことを確信しています。参照として一度シリアル化する方が良い場合は、AsReferenceDefaultとマークできます。

AsReferenceは、Stringのような独自のクラスでなくても、参照のシリアル化を処理するように設計されています。

+0

ええ、私のコードでは、サイクル参照が多いので、AsReferenceDefaultで処理する必要がありますが、残念ながらそれはしませんでしたが、AsReferenceを追加した後で動作します(AsReferenceは'List 'は 'true'に設定されていますが、' MyEntity'はすでにそれを持っています)。だから、いくつかの違いがあり、私はよく分からないのですが – GSerjo

+0

いいえ、リストは、 'MyEntity'が' AsReferenceDefault'であっても 'AsReferenceDefault'を動作させません。クラス' MyEntityList:List ' 'MyEntityList'を' AsReferenceDefault'として –

+0

ええ、それは、 'List 'プロパティに' AsReference = true'を追加せずに例外があります(再帰が検出されました)。現在、私は 'StackOverflow exception'を持っており、プロトタイプの呼び出しスタックは、同じオブジェクト(サイクル参照を持つデータ)を直列化しようとしますが、同時に' AsReferenceDefault = true'を試みます。私は 'AsReference'の動作についてちょっと不思議です、少し予期せぬことです。 – GSerjo

関連する問題