Proto3已经过简化,不再支持required
和optional
字段(请参阅Why required and optional is removed in Protocol Buffers 3)。还有办法将某个字段标记为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中指定的元数据之间的任何链接。我在这里错过了什么吗?
答案 0 :(得分:2)
经过一些修修并使用@Eric Anderson关于使用原型反射的想法,这里有一种从MyMeta
字段中检索Person.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();
答案 1 :(得分:1)
不,该功能已被删除;而是使用文档。如果您尝试将FieldOptions用于自己的扩展,那么您可以创建自己的protoc插件来生成补充代码(如验证实用程序)或在运行时使用proto反射(通过FooMessage.getDescriptor()
和Descriptors.FieldDescriptor.getOptions()
爪哇)。