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