我正在尝试序列化ItemTransaction
和protobuf-net(r282)遇到问题。
ItemTransaction : IEnumerable<KeyValuePair<Type, IItemCollection>></code>
和ItemCollection是这样的:
FooCollection : ItemCollection<Foo>
ItemCollection<T> : BindingList<T>, IItemCollection
IItemCollection : IList<Item>
其中T是项的派生类型。 ItemCollection还具有类型为IItemCollection的属性。
我像这样序列化:
IItemCollection itemCol = someService.Blah(...);
...
SerializeWithLengthPrefix<IItemCollection>(stream, itemCol, PrefixStyle.Base128);
我最终的目标是序列化ItemTransaction,但是遇到了IItemCollection。
项及其派生类型可以[de]序列化而没有问题,参见[1],但反序列化IItemCollection失败(序列化工作)。 ItemCollection具有ItemExpression属性,并且在反序列化protobuf时无法创建抽象类。这对我来说很有意义,但我不确定如何通过它。
ItemExpression<T> : ItemExpression, IItemExpression
ItemExpression : Expression
ItemExpression与Expression
一样抽象如何使其正常工作?
另外,我担心ItemTransaction会失败,因为在编译时IItemCollections将会有所不同且未知(ItemTransaction将具有FooCollection,BarCollection,FlimCollection,FlamCollection等)。
我错过了什么(马克)?
答案 0 :(得分:1)
我对整个场景并不完全清楚;但Merge
可用于传递具体项目(如果您想自己创建一个空的具体实例,并让protobuf-net填入属性)。
如果ItemExpression
用[ProtoInclude(...)]
装饰预期的ItemExpression<T>
,应允许反序列化 - 只要它从未找到它,就支持抽象类型需要创造一个!另请参阅my answer here,其中显示了这一点。
如果您可以提供我可以用来重现问题的示例,我应该能够提供更多信息。
基于一些非论坛的例子,我想我已经得出结论,支持 ,但是:
Deserialize...
,则默认情况下会将最外面的IList<T>
衍生物创建为List<T>
;您可以使用Merge
来代替,传递您选择填写的具体列表实例Item
,Foo
,Bar
都应标记为合约类型,并在Item
和Foo
之间使用适当的继承标记,并{{ 1}}和Item
但是是的;它应该工作。我给你发了一个样本邮件,并打算整理上述最外层的方法。