2016-09-30 61 views
1

對於protobuf-netr640文件夾)的最新版本,如何最好地註釋是派生類型的ProtoMemberprotobuf-net:如何註釋派生類型的屬性?

[ProtoBuf.ProtoContract([email protected]"MyBaseTypeProto")]          
[Serializable]  
public partial class MyBaseType: ProtoBuf.IExtensible { ... } 

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

[ProtoBuf.ProtoContract([email protected]"MyMessageProto")]             
[Serializable]                     
public partial class MyMessage : ProtoBuf.IExtensible           
{                        
    [ProtoBuf.ProtoMember(1, IsRequired = false, Name = @"MyList", DataFormat = ProtoBuf.DataFormat.Default)] 
    [System.ComponentModel.DefaultValue(null)]             
    public List<MyDerivedType> MyList; 

我已經嘗試添加DynamicType屬性的ProtoMember屬性,但它不認可。

我需要一個解決方案,其中可以從xml defsproto types生成類。所以理想情況下,這將通過註解到屬性定義的屬性完成。

這似乎可以使用protogen.exe根據消息類型DEFS(.proto文件),包括import語句生成類:

package MyPackage;               

import "MyDerivedTypeProto.proto";               

message MyMessage{                   
    repeated MyDerivedType MyList = 1;               
}  

import聲明顯然對生成的C#類沒有影響( .cs文件),除了加註釋:

// Generated from: MyMessageProto.proto 
// Note: requires additional types generated from: MyDerivedType.proto 

回答

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

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

[ProtoBuf.ProtoContract([email protected]"MyMessageProto")]                 
public partial class MyMessage : ProtoBuf.IExtensible           
{                        
    [ProtoBuf.ProtoMember(1, IsRequired = false, Name = @"MyList", DataFormat = ProtoBuf.DataFormat.Default)] 
    [System.ComponentModel.DefaultValue(null)]             
    public List<MyDerivedType> MyList; 

應該這樣做(未經測試,不能通過合適的計算機)。關鍵是在基本類型上的[ProtoInclude]。我刪除了[Serializable],因爲protobuf網真的不關心這一點。

+0

感謝Marc,但有可能以某種方式註釋'.proto'文件,以便'protogen.exe'自動生成'ProtoInclude'屬性? – BaltoStar

+0

@BaltoStar不,沒有語法;但是,您可以將子類屬性放在單獨的「partial」代碼文件中,因此不需要編輯生成的代碼 –