将元数据添加到 Java 的 proto3 中的字段
Add metadata to fields in proto3 for Java
Proto3 已经过简化,因此不再支持 required
和 optional
字段(参见 )。还有办法将某个字段标记为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();
Proto3 已经过简化,因此不再支持 required
和 optional
字段(参见 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();