为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

jeck猫 2024-01-28 16:59:53
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;
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

暂时忽略 JSON;在大多数语言/框架中,您将通过名称访问这些属性,无论是获取值还是检查设置了哪一个。如果名称冲突:你不能这样做。

另外:anyof允许同一类型用于受歧视联合中的多个成员,在这种情况下,您想要做的事情会变得更加混乱。

最后,回到 JSON:解析器看到"properties":-接下来它期望什么一旦解析了该值,在可区分联合中哪个字段被视为“设置”?

所以不,出于多种原因:这是不允许的。


查看完整回答
反对 回复 2024-01-28
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

我已经使用这种方式解决了 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 等高级工具。希望这可以帮助。

查看完整回答
反对 回复 2024-01-28
  • 2 回答
  • 0 关注
  • 32 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信