generics - protobuf-net 可以序列化这种接口(interface)和泛型集合的组合吗?

标签 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 是 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 , 和 ItemBar
  • 在“v2”(很快)中,有更多的控制来管理具体的列表类型(以及无类型列表的项目类型)
  • 似乎确实存在与列表反序列化相关的故障,其中规定的项目类型不是根类型。这看起来已经在“v2”中自动修复了,但我需要追查它(不幸的是,这涉及到包装器“WithLengthPrefix”/列出最外层的方法,我仍在研究)
  • 在“v2”中,如果您愿意,您可以在不需要属性的情况下完成整个事情(尽管在某些时候仍需要告诉它如何)

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

    关于generics - protobuf-net 可以序列化这种接口(interface)和泛型集合的组合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2670758/

    相关文章:

    Java Servlet - 需要使用 session 跟踪和泛型

    c# - 将方法转换为通用方法?

    c# - 通过 clrmq 进行序列化和反序列化

    c# - 序列化 WPF DataTemplates 和 {Binding Expressions}(来自 PowerShell?)

    serialization - 如何使用 Protobuf-Net 序列化 .Net Exceptions?

    java - 创建通用堆栈数组

    c# - 在 C# 中实现通用对象比较

    java - 在独立应用程序中, session 对象存储在哪里?

    c# ProtoBuf serializer 新类型

    protocol-buffers - Windows C++ .Net 下的 Protocol Buffers