【问题标题】:protobuf.net Unexpected subtypeprotobuf.net 意外的子类型
【发布时间】:2011-04-17 09:27:08
【问题描述】:

我在使用 Protobuf.net 的项目中遇到了这个异常:

InvalidOperationException "Unexpected sub-type: foo"

我要发送的课程如下所示:

class message
{
    list<bar> listOfBars;
}

foo 继承了 bar,但是 protobuf 似乎对此感到窒息并生成上述异常。有没有办法解决这个问题?我需要能够在列表中保存所有不同的 bar 子类型,因此更受类型约束的解决方案将是困难/不可能的。

【问题讨论】:

    标签: c# .net protocol-buffers protobuf-net


    【解决方案1】:

    我可能记错了,但我认为您需要在继承的类上指定哪些子类型从它继承,例如:

    [Serializable, ProtoContract, ProtoInclude(100, typeof(Foo))]
    class Bar { }
    
    [Serializable, ProtoContract]
    class Foo : Bar { } // Inherits from Bar
    

    【讨论】:

    • 我会试试的,这需要一段时间,因为 Bar 和 foo 在不同的项目中。我想我得稍微摆弄一下依赖关系:/
    • @Martin @GenericTypeTea 好答案;次要注意 - 不需要 [Serializable](但也无害)
    • 这不违反开闭原则吗?我的意思是,每次添加另一个子类时,都需要修改基类(包含属性)?此外,基类和子类需要在同一个程序集中,以避免循环依赖。还有另一种方法吗?也许手动设置 protobuf 模型(有关此的任何文档)?
    • @AntonioNakicAlfirevic:我相信你已经发现了这一点,但对于遇到此问题的其他人:stackoverflow.com/questions/6247513/protobuf-net-inheritance
    • @RenniePet:是的,这就是我最终成功使用的方法。
    【解决方案2】:

    我不是 100% 使用协议缓冲区,也许我在这里偏离了基础,但是您是否认为 List 可以从 Bar 继承自 Foo 的 List 分配?事实并非如此——它们被认为是两种没有关系的不同类型。在 .NET 4 中,支持协变类型参数,但它需要集合的支持(即使在 .NET 4 中 List 也不提供,因为这将是一个重大更改 - 可以说尝试这样做的旧代码无论如何都会被破坏,但它仍然是行为改变)

    【讨论】:

    • 我没有假设协方差,我只是想要一个可以添加(foo)到的 List
    猜你喜欢
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多