【问题标题】:How to serialize interface-typed members with protobuf .NET?如何使用 protobuf .NET 序列化接口类型的成员?
【发布时间】:2011-03-07 07:41:09
【问题描述】:

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

“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/

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

【问题讨论】:

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


    【解决方案1】:

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

    有一些事情让这个变得棘手:

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

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

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

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

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

    【讨论】:

    • 如果我在 github 存储库之外工作,这个限制仍然存在吗?
    • @james v2 可以序列化许多基于接口的模型。虽然它与最外面的物体有困难
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多