2

Proto3 已被简化,不再支持requiredand字段(请参阅为什么在 Protocol Buffers 3 中删除了 required 和 optional)。还有一种方法可以将某个字段标记为吗?我调查过,并尝试过这样的事情:optionalrequiredFieldOptions

message MyMeta {
  bool isRequired = 1;
}

extend google.protobuf.FieldOptions {
   MyMeta meta = 1234;
}

message Person {
  string name = 1 [ (meta) = { isRequired: true }];
  string address = 2  [ (meta) = { isRequired: true }];
  string remarks = 3;
}

将其编译成 Java 代码后,当我检查编译后的 Java 代码时,我没有看到我在 proto.xml 中指定的字段与其元数据之间的任何链接。我在这里错过了什么吗?

4

2 回答 2

3

经过一些修补并使用@Eric Anderson关于使用原型反射的想法,这是一种MyMetaPerson.name现场检索的方法:

    Descriptor rootDesc = PersonProto.getDescriptor();
    FieldDescriptor name = rootDesc.findFieldByName("name");
    FieldDescriptor ext = rootDesc.getFile().getExtensions().get(0);
    MyMeta meta = (MyMeta) name.getOptions().getField(ext);
    boolean isReq = meta.getIsRequired();
于 2017-10-27T07:21:03.867 回答
2

不,该功能已被删除;改用文档。如果您尝试将 FieldOptions 用于您自己的扩展,那么您可以制作自己的 protoc 插件来生成补充代码(如验证实用程序)或在运行时使用 proto 反射(通过FooMessage.getDescriptor()Descriptors.FieldDescriptor.getOptions()在 Java 中)。

于 2017-10-25T22:21:21.693 回答