如何使用protobuf .NET序列化接口类型的成员?

时间:2010-06-23 13:03:48

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

以下测试失败并显示以下错误:

  

“System.InvalidOperationException:No   找到合适的默认IB编码。“

[ProtoContract]
public class A
{
    [ProtoMember(1)]
    public IB B { get; set; }
}

public interface IB
{
}

[ProtoContract]
public class B : IB
{
    [ProtoMember(1)]
    public int SomeProperty { get; set; }
}

[TestFixture]
public class TestFixture
{
    [Test]
    public void Test()
    {
        var a = new A {B = new B()};
        using (var m = new MemoryStream())
        {
            Serializer.Serialize(m, a);
        }
    }
}

我正在使用Protobuf.net的这个实现:

http://code.google.com/p/protobuf-net/

我错过了什么吗?非常感谢你。

1 个答案:

答案 0 :(得分:1)

这是基于合同的序列化程序的一个常见功能,包括XmlSerializer等(即那些不包含每个对象的类型元数据的序列化程序)。

有一些事情使这个棘手:

  • 在反序列化期间,它会为A.B创建什么类型的文件?
  • 在序列化过程中,“当前对象是什么”与合同关系不大
    • 特别是如果类型实现多个接口
    • ,它会变得非常混乱

这是一个我希望在“v2”中获得某些工作的场景(但可能并不完全适合发布);我在想:

  • 要么A.B必须为非空才能开始(即A决定A.B的类型),或者必须在某处指定默认实现
  • 基于接口是互斥与继承;使用接口时,没有继承支持
  • 所有界面使用都是通过属性,永远不是字段(显然)

或者,也许更适合所呈现的场景,我们可以使用[ProtoInclude]之类的东西来表示具体的类型。

但在这些限度内,我认为有可能。但不是今天。