如何在消息中表示继承并生成派生类

本文关键字:派生 继承 表示 消息 | 更新日期: 2023-09-27 18:11:58

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应用于上述消息类型将不会生成所需的上述类;具体来说,它不会生成以下代码行:

[ProtoBuf.ProtoInclude(typeof(MyDerivedType), 1)]
public partial class MyDerivedType : MyBaseType

如何在消息中表示继承并生成派生类

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

看到:

消息也可以扩展,但是完成这一任务的方法不同于我们熟悉的c++或java风格的继承。相反,消息扩展是通过在基本消息中保留一定数量的字段索引来实现的,以供扩展消息使用。

协议缓冲区文档说:

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

第一篇文章还讨论了其他几种近似多态性的技术,以及每种技术的优缺点。