将元数据添加到 Java 的 proto3 中的字段

Add metadata to fields in proto3 for Java

Proto3 已经过简化,因此不再支持 requiredoptional 字段(参见 )。还有办法将某个字段标记为required吗? 我调查了 FieldOptions,并尝试了这样的事情:

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 中指定的字段及其元数据之间没有看到任何 link .我在这里错过了什么吗?

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

经过一些修改并使用@Eric Anderson 关于使用原型反射的想法,这里有一种从 Person.name 字段检索 MyMeta 的方法:

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