使用protobuf-net序列化具有接口类型成员的类

时间:2010-09-23 23:50:41

标签: c# protocol-buffers protobuf-net

我无法使用protobuf-net序列化我的类,问题似乎是protobuf-net无法序列化接口。

interface MyInterface
{
    string name;
}

[ProtoContract]
[ProtoInclude(1, typeof(MyClass1))]
[ProtoInclude(2, typeof(MyClass2))]
public abstract class ParentClass
{
    [ProtoMember(1)]
    List<MyInterface> elements;
}


[ProtoContract]
public class MyClass1 : ParentClass, MyInterface
{
    [ProtoMember(1)]
    int x;
}

[ProtoContract]
public class MyClass2 : MyInterface
{
    [ProtoMember(1)]
    string y;
}

我无法序列化MyClass1类型的任何对象,因为元素是接口列表,可以是Mylass1或MyClass2。我得到一些编码没有设置错误。

任何人都可以告诉我如何解决这个问题。感谢。

2 个答案:

答案 0 :(得分:1)

在当前的官方版本中,我不包括界面序列化支持。但是,我确实有一个补丁(来自其他用户)似乎启用了这个。

我还没有将这个补丁应用到核心,只是因为我需要在添加更多功能之前首先关注完成“v2”(特别是因为该功能需要完全重新为v2实施,但如果您愿意,我很乐意与您分享补丁。

或者:使用基类而不是接口。支持 (通过[ProtoInclude]) - 但是,您的MyClass1已经拥有父类的事实会使问题复杂化。


编辑:v2现在支持此功能。代码必须知道预期的具体实现,显然 - 但现在可以附加到接口(或者在代码中为vanilla POCO模型指定)。

答案 1 :(得分:0)

我的猜测是你需要添加:

[ProtoInclude(1, typeof(MyClass1))]
[ProtoInclude(2, typeof(MyClass2))]

MyClass1MyClass2,因为您从MyInterface继承而且序列化不知道类型。