protobuf-net能否序列化这种接口和通用集合的组合?

时间:2010-04-19 20:47:07

标签: generics serialization protobuf-net

我正在尝试序列化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等)。

我错过了什么(马克)?

[1] protobuf-net [de]serializing across assembly boundaries

1 个答案:

答案 0 :(得分:1)

我对整个场景并不完全清楚;但Merge可用于传递具体项目(如果您想自己创建一个空的具体实例,并让protobuf-net填入属性)。

如果ItemExpression[ProtoInclude(...)]装饰预期的ItemExpression<T>允许反序列化 - 只要它从未找到它,就支持抽象类型需要创造一个!另请参阅my answer here,其中显示了这一点。

如果您可以提供我可以用来重现问题的示例,我应该能够提供更多信息。


基于一些非论坛的例子,我想我已经得出结论,支持 ,但是:

  • 如果您只使用Deserialize...,则默认情况下会将最外面的IList<T>衍生物创建为List<T>;您可以使用Merge来代替,传递您选择填写的具体列表实例
  • 所有ItemFooBar都应标记为合约类型,并在ItemFoo之间使用适当的继承标记,并{{ 1}}和Item
  • 在“v2”(很快)中有更多控制来管理具体列表类型(以及无类型列表的项类型)
  • 似乎存在与列表反序列化相关的故障,其中所声明的项类型不是根类型。这看起来已经在“v2”中自动修复了,但是我需要追逐它(不幸的是触及了包装器“WithLengthPrefix”/ list最外面的方法,我还在努力)
  • 在“v2”中,如果你愿意,你可以完成所有事情而不需要属性(虽然它仍然需要被告知在某些方面)

但是是的;它应该工作。我给你发了一个样本邮件,并打算整理上述最外层的方法。