使用serde-xml-rs序列化时出现LastElementNameNotAvailable错误求助
serde-xml-rs序列化报错LastElementNameNotAvailable的解决方法
在使用serde-xml-rs解析和序列化XML的项目中,XML解析正常,但序列化时抛出LastElementNameNotAvailable错误。相关项目配置、代码及错误输出如下:
Cargo.toml配置
[package] name = "serde_xml_rs_serialization_error" version = "0.1.0" edition = "2021" [dependencies] serde = { version = "1.0.164", features = ["derive"] } serde-xml-rs = "0.6.0"
原代码(src/main.rs)
use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Deserialize, Serialize)] struct Types { #[serde(rename = "type")] types: Vec<Type>, } #[derive(Clone, Debug, Deserialize, Serialize)] struct Type { name: String, } const XML: &str = r#"<types> <type name="first"/> <type name="second"/> </types>"#; fn main() { let types: Types = serde_xml_rs::from_str(XML).expect("Cannot parse XML."); dbg!(&types); match serde_xml_rs::to_string(&types) { Ok(xml) => { dbg!(xml); } Err(error) => { dbg!(error); } }; }
运行错误输出
cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.05s Running `target\debug\serde_xml_rs_serialization_error.exe` [src\main.rs:21] &types = Types { types: [ Type { name: "first", }, Type { name: "second", }, ], } [src\main.rs:27] error = Writer { source: LastElementNameNotAvailable, }
原因分析
报错核心原因是根结构体Types未指定序列化对应的XML根元素名称。解析XML时,输入的XML有明确的根标签<types>,serde-xml-rs能正确映射到Types结构体;但序列化时,库无法自动推断根元素名称,因此抛出LastElementNameNotAvailable错误。
解决方法
给Types结构体添加#[serde(rename = "types")]属性,明确指定其对应的XML根元素名称:
修改后的代码
use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(rename = "types")] // 新增该行指定根元素名称 struct Types { #[serde(rename = "type")] types: Vec<Type>, } #[derive(Clone, Debug, Deserialize, Serialize)] struct Type { name: String, } const XML: &str = r#"<types> <type name="first"/> <type name="second"/> </types>"#; fn main() { let types: Types = serde_xml_rs::from_str(XML).expect("Cannot parse XML."); dbg!(&types); match serde_xml_rs::to_string(&types) { Ok(xml) => { dbg!(xml); } Err(error) => { dbg!(error); } }; }
验证结果
修改后运行代码,序列化会成功生成符合预期的XML:
"<types><type name=\"first\"/><type name=\"second\"/></types>"
内容的提问来源于stack exchange,提问作者user3515670
相关产品推荐
相关产品推荐

