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

时间:2017-10-30 05:52:03

标签: java 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 构建的字段。

这应该是可能的,因为当我为具有带字段的嵌套消息的根消息的proto文件构建描述符文件时。当我调试我发现的是"带有内部字段的类型消息的字段被添加到根消息",即,对于以下消息,它表示为rootMessage具有字段subMessage(type =消息)有两个子字段B,C。

示例Proto:

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

1 个答案:

答案 0 :(得分:0)

protobuf使用的想法是向父项添加嵌套消息和字段,并通过在字段中添加 setTypeName 来链接它们,并添加具有字段字段中给出的名称的嵌套消息的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());