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 一样是抽象的

我怎样才能让它正常工作?

此外,我担心 ItemTransaction 会失败,因为 IItemCollections 在编译时会有所不同且未知(ItemTransaction 将具有 FooCollection、BarCollection、FlimCollection、FlamCollection 等)。

我错过了什么(马克)?

[1] protobuf-net [de] 跨程序集边界的序列化

4

1 回答 1

1

我对整个场景并不完全清楚。然而Merge可以用来传递一个具体的项目(在你想自己创建一个空的具体实例并让 protobuf-net 填充属性的情况下)。

如果按预期ItemExpression装饰它应该允许反序列化 - 只要它从未发现需要创建抽象类型,就支持抽象类型!另请参阅我的答案here,它显示了这个正在使用中。[ProtoInclude(...)]ItemExpression<T>

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


根据一些非论坛示例,我认为我已经得出结论,这受支持的,但是:

  • 如果您只使用,则默认情况下将创建Deserialize...最外层的导数; 您可以通过使用来解决此问题,传入您选择填充的具体列表实例IList<T>List<T>Merge
  • 所有Item, Foo,Bar都应该被标记为契约类型,在ItemandFooItemand之间有适当的继承标记Bar
  • 在“v2”(很快)中有更多控制来管理具体列表类型(以及无类型列表的项目类型)
  • 似乎确实存在与列表反序列化相关的故障,其中规定的项目类型不是根类型。这看起来已经在“v2”中自动修复,但我需要通过它(不幸的是,这涉及到包装器“WithLengthPrefix”/列出最外层的方法,我仍在研究)
  • 在“v2”中,如果你愿意,你可以在不需要属性的情况下完成整个事情(尽管在某些时候仍然需要告诉它如何)

但是,是的; 它应该工作。我已经通过电子邮件向您发送了一个示例,并打算整理上述最外层的方法。

于 2010-04-20T22:41:30.233 回答