背景

配置文件增加字段之后,旧配置是否还能加载,取决于默认值和未知字段策略。序列化兼容是明确的产品行为,不是 derive 自动保证的结果。

核心判断

  1. 新增可选字段提供符合业务含义的默认值。
  2. 重命名字段时评估 alias 与迁移周期,避免突然拒绝旧名称。
  3. 协议输入是否允许未知字段要明确,配置和外部消息可以采用不同策略。

最小示例

下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。

fn default_retries() -> u32 { 3 }

#[derive(serde::Deserialize)]
struct Config {
    #[serde(default = "default_retries")]
    retries: u32,
    endpoint: String,
}

边界与误区

serde(default) 对 u32 的默认值是零,不一定是想要的重试次数。示例用显式默认函数,endpoint 仍是必填字段;反序列化成功后继续校验业务范围。

验证方式

保留上一版本配置作为夹具,测试新字段缺失、旧名称、未知字段和非法值。序列化输出变化也要检查,不能只测试读取。

小结

新增字段提供默认值,未知字段有兼容策略,格式差异集中在转换层。