#3086·serde

添加使用默认字段值作为 serde 默认值的方式

作者: DarkFenX创建于 2026年7月20日更新于 2026年7月20日
rust
#![feature(default_field_values)]

#[derive(serde::Deserialize)]
struct S1 {
    tag: i8,
    data: Vec<i8> = Vec::new(),
}

#[derive(serde::Deserialize)]
struct S2 {
    #[serde(default)]
    field1: S1 = S1 { tag: 2, .. },
}
这个代码会出现以下错误:

error[E0277]: 类型约束 S1: Default 未满足 --> core_lib/src/lib.rs:11:5 | 11 | / #[serde(default)] 12 | | field1: S1 = S1 { tag: 2, .. }, | |__________________________________^ 类型 Default 未实现 S1 | help: 可以考虑为 S1 { tag: 2, .. } 标记 #[derive(Default)] | 4 + #[derive(Default)] 5 | struct S1 { |


如果能让 serde 使用 `S1 { tag: 2, .. }` 作为 S2.field1 的默认值,而该字段在反序列化时未设置,那就太好了。个人认为,这可能会成为 `#[serde(default)]` 的常规行为(不要求字段类型实现 Default,从结构中指定的默认值中获取)。这样,默认值的优先级顺序会是: