2017-10-30 5 views
0

私は最近Protobufsの作業を開始しました。私を助けてもらえますか?DescriptorProto.Builderプロトコルバッファにサブフィールドを追加

サンプルコード:

DescriptorProto.Builder builder; 
FieldDescriptorProto.Builder fieldBuilder = FieldDescriptorProto.newBuilder() 
        .setLabel(label) 
        .setType(type) 
        .setName("name") 
        .setNumber(1) 
        .setDefaultValue("value"); 
builder.addField(fieldBuilder.build()); 

今すぐフィールドの型がFieldDescriptorProto.Type.TYPE_MESSAGEでみましょう。 fieldBuilderを使用して作成されたフィールドにサブフィールドを広告する必要があります。

これは、フィールドを含むネストされたメッセージを持つルートメッセージを持つプロトファイル用のディスクリプタファイルを作成するときに可能になるはずです。私が見つけたものをデバッグすると、 "内部フィールドを持つタイプのメッセージのフィールドがルートメッセージに追加されます"、つまり、次のメッセージの場合、rootMessageは2つのサブフィールドBを持つフィールドsubMessage(type = Message) 、C.

サンプルプロト:

message rootMessage{ 
     string A = 1; 
     message subMessage{ 
     string B = 1; 
     string C = 2; 
     } 
     subMessage sub = 2; 
} 

通常、私はアイデアいるProtobufが使用する

FieldDescriptorProto.Builder fieldBuilder = FieldDescriptorProto.newBuilder() 
        .setLabel(label) 
        .setType(type) 
        .setName("name") 
        .addField(...) // **This Part** 
        .setNumber(1) 
        .setDefaultValue("value"); 

答えて

0

のようなものを必要とするが、親にネストされたメッセージやフィールドを追加し、追加することによって、それらをリンクすることですセットタイプ名フィールドに指定された名前のネストされたメッセージを追加してください。タイプ名

DescriptorProto.Builder builder; 
FieldDescriptorProto.Builder fieldBuilder =FieldDescriptorProto.newBuilder() 
          .setLabel(label) 
          .setType(type) 
          .setName("name") 
          .setTypeName("nestedMessageName") 
          .setNumber(1) 
          .setDefaultValue("value"); 
builder.addField(fieldBuilder.build()); 
builder.addNestedMessage(messageBuilder.setName("nestedMessageName").build()); 
関連する問題