如何在消息中表示继承并生成派生类
本文关键字:派生 继承 表示 消息 | 更新日期: 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文件中使用这些数字标记为您的消息类型声明新字段,而无需编辑原始文件。
第一篇文章还讨论了其他几种近似多态性的技术,以及每种技术的优缺点。