4

以下测试失败并出现此错误:

“System.InvalidOperationException:找不到合适的默认 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/

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

4

1 回答 1

2

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

有几件事使这个变得棘手:

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

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

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

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

但在这些范围内,我认为有些事情是可能的。但不是今天。

于 2010-06-23T14:31:26.853 回答