Rust中使用serde-xml-rs从struct生成XML如何避免重复标签
Rust serde-xml-rs 嵌套结构体XML标签重复问题解决方案
问题原因
serde-xml-rs 0.5.1版本默认的序列化规则会触发两层标签生成:
- 序列化
A结构体的b字段时,会先生成字段重命名后的<B>标签 - 序列化
B类型的字段值时,会再生成一层和结构体名对应的<B>标签
两层叠加就出现了重复的B标签。
解决方案
方案1:为嵌套结构体添加#[serde(transparent)]属性
该属性会让serde跳过为B结构体本身生成外层标签,直接序列化内部的字段,适合B结构体仅作为嵌套结构使用、不需要单独生成外层标签的场景:
#[derive(Serialize, Debug)] struct A { #[serde(rename(serialize = "B"))] pub b: B } // 新增serde(transparent)属性 #[derive(Serialize, Debug)] #[serde(transparent)] struct B { pub c: String }
方案2:为上层字段添加#[serde(flatten)]属性
如果B结构体在其他场景需要保留自身的外层标签,可以用该方案,把B结构体的字段直接展开到上层,同时给B结构体配置序列化名称:
#[derive(Serialize, Debug)] struct A { // 替换原来的rename为flatten #[serde(flatten)] pub b: B } // 给B结构体添加rename配置 #[derive(Serialize, Debug)] #[serde(rename(serialize = "B"))] struct B { pub c: String }
两种方案修改后,序列化输出都符合预期的单层B标签效果。
内容的提问来源于stack exchange,提问作者chocolate cake
相关产品推荐
相关产品推荐

