扩展机制
扩展机制
TsFile 主要通过三种方式增加能力:分配新的类型或编解码器编号、增加 Footer 属性,或者定义新的文件布局。选择哪种方式,取决于读取器在不理解新能力时,是否仍能找到下一个结构的边界。
Footer 属性容易确定边界:每个属性由 VarString 键和可空的 VarBinary 值组成,读取器无需解释值的内容,就能保留未知属性。Chunk 也有明确的字节长度,扫描器即使不支持其中的编解码器,仍可以跳过。数据区标记没有统一的长度字段,遇到未知标记时就不能套用同样的做法。
安全演进规则
兼容的扩展应保留已有字段的含义和边界:
- 新类型和编解码器使用未分配的编号,已分配编号的含义保持不变。
- 新编解码器说明支持的数据类型、字节布局、输出长度及错误处理方式。
- 沿用现有的字节序和长度约定。
- 解码目标数据必须使用、但读取器不支持的能力,应明确报错。
如果直接在 Header 中增加字节,却没有规则选择新布局,旧读取器预期的后续字段位置就会改变。这类修改需要新的版本号,或明确的扩展机制。
Page AEAD 使用了后一种方式:0x06 文件加密头决定额外的 Chunk Header 字段和 profile 指定的 Page 帧格式,文件版本字节仍为 0x04。旧 v4 读取器可能拒绝这些文件。 加密说明了其布局和能力要求;仅支持基础格式版本还不够。
属性与语义
一个属性可以被跳过,不代表它的含义总能被忽略。描述性属性可以是可选的;如果属性会改变 Page 字节的解码方式,就需要明确规定读取器应如何支持。读取器无法执行必要的加密处理或其他解释规则时,应报告错误,不能按默认方式继续解码。