3

をシリアル化しようとしていますがItemTransaction、protobuf-net (r282) に問題があります。

ItemTransaction : IEnumerable<KeyValuePair<Type, IItemCollection>></code>

ItemCollection は次のようになります。

FooCollection : ItemCollection<Foo>
ItemCollection<T> : BindingList<T>, IItemCollection
IItemCollection : IList<Item>

ここで、T は Item の派生型です。ItemCollection には、IItemCollection 型のプロパティもあります。

私はこのようにシリアライズしています:

IItemCollection itemCol = someService.Blah(...);
...
SerializeWithLengthPrefix<IItemCollection>(stream, itemCol, PrefixStyle.Base128);

私の最終的な目標は、ItemTransaction をシリアル化することですが、IItemCollection に引っかかっています。

アイテムとその派生型は問題なく [逆] シリアル化できます。[1] を参照してください。ただし、IItemCollection の逆シリアル化は失敗します (シリアル化は機能します)。ItemCollection には ItemExpression プロパティがあり、逆シリアル化する場合、protobuf は抽象クラスを作成できません。これは私には理にかなっていますが、どうすればそれを乗り越えられるかわかりません。

ItemExpression<T> : ItemExpression, IItemExpression
ItemExpression : Expression

ItemExpression は Expression と同様に抽象的です

これを正しく機能させるにはどうすればよいですか?

また、コンパイル時に IItemCollections が異なり、不明になるため、ItemTransaction が失敗するのではないかと心配しています (ItemTransaction には FooCollection、BarCollection、FlimCollection、FlamCollection などがあります)。

何が足りないのですか (Marc) ?

[1] protobuf-net [de]アセンブリの境界を越えたシリアル化

4

1 に答える 1

1

シナリオ全体については完全にはわかりません。ただしMerge、具体的な項目を渡すために使用できます (空の具体的なインスタンスを自分で作成し、protobuf-net にプロパティを入力させたい場合)。

が期待どおりにItemExpression装飾されている場合、逆シリアル化を許可する必要があります-抽象型を作成する必要がない限り、抽象型がサポートされます! これが使用されていることを示す私の回答 hereも参照してください。[ProtoInclude(...)]ItemExpression<T>

問題を再現するために使用できる例を提供していただければ、より多くの情報を提供できるはずです。


フォーラム外の例に基づいて、これはサポートされていると結論付けたと思いますが、

  • を使用するだけの場合Deserialize...、最も外側のIList<T>導関数はデフォルトで として作成されますList<T>Merge代わりに、選択した具体的なリストインスタンスを渡すことで、これを回避できます。
  • 、 、のすべてはItem、と、 、の間に適切な継承マーカーを付けて、コントラクト型としてマークする必要があります。FooBarItemFooItemBar
  • "v2" (まもなく) では、具体的なリストの種類 (および型指定されていないリストの項目の種類) を管理するためのより多くの制御があります。
  • 記載されているアイテム タイプがルート タイプではないリストのデシリアライゼーションに関連する不具合があるようです。これは「v2」で自動的に修正されたようですが、追跡する必要があります (残念ながら、これはラッパー「WithLengthPrefix」/最も外側のメソッドに触れており、まだ取り組んでいます)
  • 「v2」では、必要に応じて属性を必要とせずにすべてを行うことができます(ただし、ある時点で方法を伝える必要があります)

でも、はい; それはうまくいくはずです。私はあなたにサンプルを電子メールで送り、前述の最も外側のメソッドを整理するつもりです。

于 2010-04-20T22:41:30.233 に答える