如何使必需的节俭字段可选?

AJH*_*AJH 6 thrift

在节俭中创造一个required领域的最佳过程是什么?optional例如,我有一个结构...

struct Message {
    1: required double userID;
    2: required string content;
    ...
} 
Run Code Online (Sandbox Code Playgroud)

...但我想做出content选择.

编辑:为了澄清,我已经有消费者使用这个结构,所以我需要更新它而不破坏这些消费者.分阶段升级很好(即 ​​- 添加新optional字段,更新下游客户端,然后删除 - 或停止使用 - 旧required字段).

Jen*_*nsG 10

你不能,因为俗话所说是永远的.以下是Diwaker Gupta强烈推荐的"失踪指南"的引用.它几乎指出了为什么在使用之前应该三思而后行(至少)required:

永远是必需的

您应该非常小心地根据需要标记字段.如果您希望在某个时刻停止写入或发送必填字段,则将字段更改为可选字段会有问题 - 旧读者会认为没有此字段的邮件不完整,可能会无意中拒绝或丢弃它们.您应该考虑为缓冲区编写特定于应用程序的自定义验证例程.有人得出的结论是,使用所需要的弊大于利; 他们更喜欢只选择使用.但是,这种观点并不普遍.

我担心唯一的选择是弃用整个结构并创建一个新结构.

除此之外,实际上有三个必要程度,其中只有两个有关键词:

  • required:必须在读取时存在,必须在写入时设置
  • optional:可能设置也可能不设置,完全可选
  • "default":读取时可能不存在,总是写入(除非是null指针)

当既未指定也requiredoptional指定时,隐式应用"默认"要求.

正如人们清楚地看到的那样,required如果我们查看事物的兼容性网站,那么限制是相当严格的.即使向required结构添加新字段也可能导致不兼容,例如,如果新客户端正在从旧服务器读取数据(反之亦然),因为新required字段不在旧impl所写的数据中,而是由新的冲击