【问题标题】:Can protobuf-net serialize this combination of interface and generic collection?protobuf-net 可以序列化这种接口和泛型集合的组合吗?
【发布时间】:2010-04-19 20:47:06
【问题描述】:

我正在尝试序列化 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 困住了。

Item 及其派生类型可以毫无问题地 [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

【问题讨论】:

标签: generics serialization protobuf-net


【解决方案1】:

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

如果ItemExpression[ProtoInclude(...)] 装饰为预期的ItemExpression&lt;T&gt;,它应该允许反序列化 - 只要它永远不会发现需要创建抽象类型,就支持抽象类型!另请参阅my answer here,它显示了这个正在使用中。

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


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

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

但是是的;它应该工作。我已经给你发了一个示例,打算整理一下前面提到的最外层的方法。

【讨论】:

  • @tsupe - "Error 320", "您提供的文件下载密钥无效。";您可以尝试直接给我发电子邮件(请参阅我的个人资料页面)
  • 谢谢,马克。我已经给你发邮件了。
  • 根据我们的电子邮件和我的调查,protobuf-net v1 目前无法满足我们的需求,并且当前的时间表和情况不允许我们使用非生产代码。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多