将子字段添加到 DescriptorProto.Builder 协议缓冲区

Adding Sub Fields to a DescriptorProto.Builder Protocol Buffers

我最近开始研究 protobufs,发现以下问题很棘手。你能帮帮我吗?

示例代码:

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.

构建的字段中

这应该是可能的,因为当我为原型文件构建描述符文件时,其根消息具有带字段的嵌套消息。当我调试时,我发现 "A field of type message with its inner fields is added to the root message ",即对于以下消息,它表示为 rootMessage 有一个字段 subMessage(type = Message) 和两个子字段 B、C.

示例原型:

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

通常我需要像

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

protobuf 使用的想法是通过在字段中添加 setTypeName 来向父项和 link 添加嵌套消息和字段,并添加嵌套消息字段中给出的名称 typeName

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());