如何使用 proto3 oneof 功能复制字段名称?

Proto3 支持 oneof 功能,您可以在一条消息中包含多个字段,并且最多同时设置一个字段。

由于一次会设置一个字段,因此原型模式中存在重复的字段名称是合理的。问题是原型生成器将其视为重新定义。

我想这样做,因为在我的情况下,这使得 json 序列化变得JsonFormat简单。

例如,我可能喜欢

message MyResponse {

    int32 a = 1;

    string b = 2;

    oneof Properties {

        PropertiesType1 properties = 3;

        PropertiesType2 properties = 4;

        PropertiesType3 properties = 5;

        PropertiesType4 properties = 6;

    }

}

有没有办法解决这个问题,或者必须努力重新定义原型?一个可能的解决方法可能是例如使用map<string, Properties> properties = 9;


jeck猫
浏览 36回答 2
2回答

暮色呼如

暂时忽略 JSON;在大多数语言/框架中,您将通过名称访问这些属性,无论是获取值还是检查设置了哪一个。如果名称冲突:你不能这样做。另外:anyof允许同一类型用于受歧视联合中的多个成员,在这种情况下,您想要做的事情会变得更加混乱。最后,回到 JSON:解析器看到"properties":-接下来它期望什么?一旦解析了该值,在可区分联合中哪个字段被视为“设置”?所以不,出于多种原因:这是不允许的。

慕哥6287543

我已经使用这种方式解决了 JSON 序列化的类似用例。message MyResponse {    int32 a = 1;    string b = 2;    oneof Properties {        PropertiesType1 properties1 = 3 [json_name = "properties"];        PropertiesType2 properties2 = 4 [json_name = "properties"];        PropertiesType3 properties3 = 5 [json_name = "properties"];        PropertiesType4 properties4 = 6 [json_name = "properties"];    }}如果您使用 protoc 编译器,这会起作用,但它不适用于 buf lint/build 等高级工具。希望这可以帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java