2016-10-05 34 views
0

protobuf-net proto2 c#protobuf-net:如何在消息中表示繼承並生成派生類?

這裏是我的.cs文件,對於protobuf-net序列化/反序列化工作:

[ProtoBuf.ProtoContract([email protected]"MyBaseTypeProto")] 
[ProtoBuf.ProtoInclude(typeof(MyDerivedType), 1)] 
public partial class MyBaseType { ... } 

[ProtoBuf.ProtoContract([email protected]"MyDerivedTypeProto")] 
public partial class MyDerivedType : MyBaseType { ... } 

[ProtoBuf.ProtoContract([email protected]"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 

回答

1

協議緩衝器不支持繼承的形式這是類似於(或映射)到在C++/C#/ Java的直觀的繼承。

參見here

消息還可以擴展,但該方法通過這一步完成從熟悉C++或Java的樣式繼承不同。相反,通過在基本消息中保留一些字段索引以供擴展消息使用來實現消息擴展。

而且protocol buffer docs說:

擴展讓你聲明的消息範圍字段數可用於第三方擴展。其他人可以在自己的.proto文件中使用這些數字標籤爲消息類型聲明新字段,而無需編輯原始文件。

第一篇文章還討論了其他幾種用於近似多態性的技術,以及每種技術的優缺點。

+0

所以'protobuf' spec說支持具有繼承的類結構,'message type defs'應該保留一系列'字段索引'來滿足所有潛在的子分類需求:以這種方式,消息利用組合「內部「來支持」外部「繼承。但是如何克服由於在「sub-class」消息中所有字段都被標記爲平等成員的缺點,'protogen.exe'不能生成正確表示其基類的派生類? – BaltoStar

+0

我覺得你必須適應,而不是克服。以不同的方式思考你的問題,所以它不需要在消息類中繼承。你可能在你自己的類中有繼承,這些類包裝和/或確定如何解析消息。 – asynchronos