我正在为 GSM 网络内部使用的一个小协议编写技术文档。该协议在连续的字节流中使用模式 [id1] + [byte[] data1]、[id2] + [byte[] data2] 等。
关键是由于各种原因(未来的可扩展性和向后兼容性),某些字段未使用。该字段的值是选择谁实现协议(目前默认值来自用于实现协议的语言/框架,即字节数组元素的默认值)。
现在的问题。以某种方式为未使用的字段施加默认值是否有用?
我正在为 GSM 网络内部使用的一个小协议编写技术文档。该协议在连续的字节流中使用模式 [id1] + [byte[] data1]、[id2] + [byte[] data2] 等。
关键是由于各种原因(未来的可扩展性和向后兼容性),某些字段未使用。该字段的值是选择谁实现协议(目前默认值来自用于实现协议的语言/框架,即字节数组元素的默认值)。
现在的问题。以某种方式为未使用的字段施加默认值是否有用?
如果有的话,优势将在于使用这些字段的协议的未来版本。默认的“坏”值将使接收方确定正在使用旧版本的协议。
一般来说,我会说“是”。指定默认值和填充值后,您可以在未来基于现有填充值对协议进行更改。如果您现在不能依赖在线上的字节,那么将来就没有好的方法来对这些字节强制执行结构。更不用说,允许“实现依赖值”泄漏到二进制规范中通常是一个坏主意。这就是我最终在“在线”结构中使用 8 字节填充和 Intel 排序的 IP 地址的方式。
指定未使用字段的值通常是一个好主意,如下所示: - 发送者必须将该字段设置为零 - 接收者必须忽略该字段
这样,在将来的某个时间点,您可以选择将该字段用于某些新功能。当您这样做时,为了向后兼容,您所要做的就是将字段的值 0 定义为“在引入新功能之前的旧行为。
(实际上,引入某种形式的能力声明也是一个好主意,它允许一方发现另一方是否支持该功能,换句话说,另一方是否能够理解非零值场。)