【问题标题】:protobuf-net : how to represent inheritance in messages and generate derived classes?protobuf-net:如何在消息中表示继承并生成派生类?
【发布时间】:2017-02-14 13:02:22
【问题描述】:

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# code-generation protocol-buffers protobuf-net subtype


    【解决方案1】:

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

    here:

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

    protocol buffer docs 说:

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

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

    【讨论】:

    • so protobuf 规范说支持具有继承的类结构,message type defs 应该保留field indexes 的范围以满足所有潜在的子类化需求:以这种方式,消息利用组合“内部”以支持“外部”继承。但是如何克服由于在“子类”消息中所有字段都标记为相同成员的缺点,protogen.exe 无法生成正确标记其基类的派生类?
    • 我认为你必须适应,而不是克服。以不同的方式考虑您的问题,因此它不需要在消息类中继承。您可能在自己的类中有继承,这些类包装和/或确定如何解析消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多