2010-06-23 73 views
3

下面的测试失败,此错误:如何使用protobuf .NET序列化接口类型的成员?

"System.InvalidOperationException : No suitable Default IB encoding found."

[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

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

有几件事情,让这个棘手:

  • 反序列化时,它会造成什么类型​​A.B
  • 序列化的过程中,“什么是当前对象”承载了该合同
      特别
    • 如果类型实现了它变得非常混乱的关系不大多个接口

这是一个场景我想在“v2”中找到一些适合的工作(但可能不太适合发布)。我在想:

  • 要么A.B必须为非空入手(即A决定的A.B类型),或默认实现,必须指定的地方
  • 基于接口的相互排斥与遗产;使用接口时,就没有继承支持
  • 所有接口的用法是通过性,从未字段(显然)

或者,也许更适合提出的方案中,我们可以使用类似[ProtoInclude]指示具体类型。

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

+0

如果我正在使用github存储库,这个限制仍然是真的吗? – James 2014-08-25 05:01:12

+0

@james v2可以序列化许多基于接口的模型。尽管如此,它与最外层的对象仍然相似 – 2014-08-25 07:02:54

相关问题