Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何用protobuf.NET序列化接口类型的成员?_C#_Serialization_Protocol Buffers_Protobuf Net - Fatal编程技术网

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

C# 如何用protobuf.NET序列化接口类型的成员?,c#,serialization,protocol-buffers,protobuf-net,C#,Serialization,Protocol Buffers,Protobuf Net,以下测试因此错误而失败: “System.InvalidOperationException:否 找到合适的默认IB编码。“ 我正在使用Protobuf.net的这个实现: 我错过什么了吗?非常感谢。这是基于契约的序列化程序的一个常见功能,包括XmlSerializer等(即不包括每个对象的类型元数据的序列化程序) 有几件事让这件事变得棘手: 在反序列化过程中,它将为A.B创建什么类型 在序列化过程中,“当前对象是什么”与契约关系不大 特别是,如果类型实现了多个接口,它会变得非常混乱

以下测试因此错误而失败:

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

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


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

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

有几件事让这件事变得棘手:

  • 在反序列化过程中,它将为
    A.B
    创建什么类型
  • 在序列化过程中,“当前对象是什么”与契约关系不大
    • 特别是,如果类型实现了多个接口,它会变得非常混乱
这是一个我想在“v2”中实现的场景(但可能不太适合发布);我在想:

  • A.B
    必须以非null开头(即
    A
    决定
    A.B
    的类型),或者必须在某个地方指定默认实现
  • 基于接口与继承是互斥的;使用接口时,不能支持继承
  • 所有接口的使用都是通过属性,而不是字段(显然)
或者,我们可以使用类似于
[ProtoInclude]
的东西来指示具体的类型,这可能更适合所呈现的场景


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

如果我在github存储库中工作,这个限制是否仍然有效?@james v2可以序列化许多基于接口的模型。但它对最外层的物体有困难
[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);
        }
    }
}