protobuf的语法3使所有字段成为可选字段,从而删除了关键字required
以及optional
以前的proto2语法。阅读开发人员的一些评论似乎是为了增强向前/向后二进制兼容性而完成的。
但是对我而言,这可以通过仅对软件包名称进行版本控制(例如说)com.example.messages.v1
,然后让客户端实施他们理解的反序列化程序来实施。同时,它删除了一些从软件工程的角度来看有用的合同类型。例如,如果我有
message Location {
double latitude = 1;
double longitude = 2;
}
在proto3中,可以Location
通过不提供必填字段之一来创建半备份但完全有效的文件。
创建基于模式的序列化格式以在客户端之间交换数据时,这不是一个很大的缺点吗?将额外的验证代码移至每个客户端以检查所有必填字段均具有有效值,这不是更糟吗?