1

私は数週間前のprotobuf-netのv2のバージョンを非常にうまく使用していました。(Compact Frameworkで実行されるプリコンパイル済みシリアライザーの速度のためにV2を使用したいと思います。)Dictionary型のプロパティを使用してオブジェクトをシリアル化しようとするまで、すべてがうまく機能しました。次のエラーが発生しました。

{"タイプにシリアライザーが定義されていません:System.Collections.Generic.KeyValuePair`2 [[System.String、mscorlib、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]、[System.String、mscorlib、Version = 2.0 .0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]] "}

辞書のサポートを改善するために最近変更が加えられたようだったので、今日から最新のコードを入手しました。CF3.5およびFF3.5dllをビルドした後、再試行しました。「フリーズするとモデルを変更できません」という別のエラーが表示されます。DictionaryプロパティからProtoMember属性を削除すると、すべてうまく機能しているようです。

protobuf-netのv2で辞書を使用した人はいますか?これはまだリリースの時期が早すぎて使用できませんか?私の速度テストでは、v2が2倍高速であることが示されましたが、それは正確に見えますか(安定性の低いv2プレアルファビットを使用したいという私の願望を検証しています)。

4

1 に答える 1

2

それは間違いなく興味深いことです。調査に使用できる特定のデモはありますか?(私は著者です)


問題は単なるバグです。その間Compile()にモデルをカスケードする必要があり、他にどのようなタイプが必要かを確認します。現時点ではこれを行いません(ただし、まもなく; pになります)。通常の.NET(with RuntimeTypeModel)では、これは問題ではありません。追加のタイプをその場で追加できます。しかし、CF(または静的にコンパイルされたdll)では、これは不可能です。

修正されるまでCompile()、ここでのチートは、他に何が必要かを伝えることです。最も簡単な方法は、次のインデクサーに触れることですKeyValuePair<string,string>

model.Add(typeof(Parent), true);
var discard = model[typeof(KeyValuePair<string, string>)];
model.Compile(...);

このインデクサーによって返される値(into discard)は必要ありません。コンパイルを呼び出す前に、いくつかの空白を埋めるために実行されている必要があります。

于 2010-06-17T22:28:38.217 に答える