当前位置: 首页 > news >正文

AIP-146 泛化域

编号146
原文链接AIP-146: Generic fields
状态批准
创建日期2019-05-28
更新日期2019-05-28

API中的大多数域,无论是在请求、资源还是自定义应答中,都有具体的类型或模式。这个模式是约定的一部分,开发者依此约定进行编码。

然而,偶尔会有一些泛化或多态域,可以符合多种模式,甚至是完全可以是任意形式的。

指南

虽然泛化域往往很少见,服务 可以 在必要时使用泛化域。根据域需要的泛化程度,有几种方法可以做到这一点;一般来说,服务 应当 尝试使用能够满足用例的“最低泛化”方法。

Oneof

oneof 可以 用于引入联合类型:用户或服务可以指定 oneof 中的一个域。此外 oneof 可以 可以包含同类型域(通常是字符串),表示选项之间存在语义差异。

由于 oneof 中的各个域有不同的键,开发者可以通过编程确定使用哪个(如果有)域。

oneof 为每个选项保留了最大程度的类型安全性和语义意义,服务 应当 在可行时通常优先选择它们,而不是其他泛化或多态选项。然而,当有大量(或无限)的潜在选项时,或者当有需要一系列“级联oneof”的大型资源结构时,oneof构造是不合适的。

注意 向现有的oneof添加额外的可能域是非破坏性更改,但将现有域移入或移出oneof是破坏性的(它会在Go protobuf存根中创建向后不兼容的更改)。

Maps

Maps 可以 用于需要许多/相同类型/的值,但键未知或由用户决定的情况。

Maps通常不适合泛化域,因为map值都共享一个类型,但偶尔它们是有用的。特别是,map有时可以适用于需要许多相同类型的对象,并根据其键的/名字/具有不同行为的情况(例如,使用键作为环境/名字/)。

Struct

[google.protobuf.Struct][struct]对象 可以 用于表示任意嵌套的JSON。键可以是字符串,值可以是浮点数、字符串、布尔值、数组或额外的嵌套结构,允许表示为JSON的任意嵌套结构(并且在使用REST/JSON时自动表示为JSON)。

当服务事先不知道模式时,或者当服务需要存储和检索任意但结构化的用户数据时,Struct最有用。在这种情况下,使用Struct对用户来说很方便,因为他们可以轻松获取可以在其选择的环境中本地操作的JSON对象。

如果服务需要推理Struct的/模式/,它 应当 使用[JSONSchema][]来实现这一目的。因为JSONSchema本身是JSON,所以有效的JSONSchema文档本身可以存储在Struct中。

Any

[google.protobuf.Any][any]对象可以用于发送任意序列化的协议缓冲区和类型定义。

然而,这引入了复杂性,因为如果消费者无法访问proto,Any除了盲目数据传播之外,对任何其他任务都变得无用。此外,即使消费者/确实/有proto,消费者也必须确保类型已注册,然后手动反序列化,这是一个通常不熟悉的过程。

因此,除非其他选项不可行,否则 不应 使用Any。

http://www.dtcms.com/a/22779.html

相关文章:

  • ubuntu下安装TFTP服务器
  • Linux 固定 IP 地址和网关
  • [M二分] lc1760. 袋子里最少数目的球(二分答案+数学推导+GoLang使用技巧)
  • idea 2019.3常用插件
  • springboot接入ShardingJDBC
  • Mac zsh使用相关问题之一
  • (算法基础——树)——python树结构使用指南
  • EM235 模块
  • xxl-job分布式调度平台
  • Java并发编程6--重排序
  • 动态规划 之 背包问题
  • 融合模型预测控制 (MPC) 的 RL 算法
  • 【产品推介】可驱动5A负载的降压型DC/DC转换器XBL1663
  • Jenkins同一个项目不同分支指定不同JAVA环境
  • 穷举 vs 暴搜 vs 深搜 vs 回溯 vs 剪枝
  • 基于Flask的广西高校舆情分析系统的设计与实现
  • 《Nuxt.js 实战:从放弃到入门》六、打造个性化文字转图片工具
  • 各类系统Pycharm安装教程
  • MongoDB between ... and ... 操作
  • Android嵌套滑动造成的滑动冲突原理分析
  • 解惑Python:一文解决osgeo库安装失败问题
  • DeepSeek + Vue实战开发
  • Python字符模糊匹配指南 RapidFuzz | python小知识
  • RocketMQ 5.0安装部署
  • Ubuntu 安装 OpenCV (C++)
  • 请解释设备像素、CSS 像素、设备独立像素、DPR、PPI 之间的区别 ?
  • 将图片base64编码后,数据转成图片
  • Jetson Agx Orin平台preferred_stride调试记录--1924x720图像异常
  • SQL代码规范
  • 外贸跨境订货系统流程设计、功能列表及源码输出