protobuf-net:如何在消息中表示继承并生成派生类?

时间:2016-10-05 22:52:30

标签: c# code-generation protocol-buffers protobuf-net subtype

RecipeBrain

以下是适用于protobuf-net proto2 c#序列化/反序列化的.cs文件:

protobuf-net

是否可以撰写[ProtoBuf.ProtoContract(Name=@"MyBaseTypeProto")] [ProtoBuf.ProtoInclude(typeof(MyDerivedType), 1)] public partial class MyBaseType { ... } [ProtoBuf.ProtoContract(Name=@"MyDerivedTypeProto")] public partial class MyDerivedType : MyBaseType { ... } [ProtoBuf.ProtoContract(Name=@"MyMessageProto")] public partial class MyMessage { [ProtoBuf.ProtoMember(1, IsRequired = false, Name = @"MyList", DataFormat = ProtoBuf.DataFormat.Default)] public List<MyDerivedType> MyList; 个文件,以便.proto生成以上文件?

类似的东西:

protogen.exe

但应用于上述消息类型的MyBaseType.proto message MyBaseType { ... } MyDerivedType.proto message MyDerivedType { ... } MyMessage.proto import "MyDerivedType.proto" message MyMessage{ repeated MyDerivedType MyList = 1; } 将不会根据需要生成上述类;特别是它不会生成这些代码行:

protogen.exe

1 个答案:

答案 0 :(得分:2)

协议缓冲区不支持以与C ++ / C#/ Java中的直观继承类似(或映射到)的形式继承。

请参阅here

  

也可以扩展消息,但实现它的方法与熟悉的C ++或Java风格的继承不同。相反,通过在基本消息中保留一些字段索引以供扩展消息使用来实现消息扩展。

protocol buffer docs说:

  

扩展程序允许您声明邮件中的一系列字段编号可用于第三方扩展。然后,其他人可以在他们自己的.proto文件中使用这些数字标签为您的消息类型声明新字段,而无需编辑原始文件。

第一篇文章还讨论了几种近似多态性的其他技术,各有利弊。