我正在尝试序列化 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 一样是抽象的
我怎样才能让它正常工作?
此外,我担心 ItemTransaction 会失败,因为 IItemCollections 在编译时会有所不同且未知(ItemTransaction 将具有 FooCollection、BarCollection、FlimCollection、FlamCollection 等)。
我错过了什么(马克)?
[1] protobuf-net [de]serializing across assembly boundaries
最佳答案
我对整个场景并不完全清楚。然而 Merge
可用于传入一个具体的项目(如果您想自己创建一个空的具体实例并让 protobuf-net 填充属性)。
如果 ItemExpression
装饰有 [ProtoInclude(...)]
对于预期的ItemExpression<T>
它应该允许反序列化 - 只要它从未发现需要创建抽象类型,就支持抽象类型!另见 my answer here这表明它在使用中。
如果您可以提供一个我可以用来重现该问题的示例,我应该能够提供更多信息。
根据一些非论坛示例,我认为我已经得出结论,这是受支持的,但是:
Deserialize...
,最外面的IList<T>
默认情况下将创建导数 List<T>
;您可以使用 Merge
来解决此问题相反,传入您选择的具体列表实例来填充Item
, Foo
, Bar
应标记为契约(Contract)类型,在 Item
之间使用适当的继承标记和 Foo
, 和 Item
和 Bar
但是,是的;它应该工作。我已经通过电子邮件向您发送了一个示例,并打算整理上述最外层的方法。
关于generics - protobuf-net 可以序列化这种接口(interface)和泛型集合的组合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2670758/