xml - 使用serde序列化结构时,如何展平 `Vec`字段?

标签 xml rust serde

我有一些XML,其中的标签包含多个同名的同级标签,如下所示:

<foo>
    <bar/>
    <bar/>
</foo>

(虽然我还没有尝试对它进行反序列化,但也可能还有多个顶级<foo>。)

使用此代码:

use serde::{Deserialize, Serialize};
use quick_xml::de::from_str;
use quick_xml::se::to_string;

#[derive(Debug, Deserialize, PartialEq, Serialize)]
pub struct Foo {
    #[serde(rename = "bar", default)]
    bars: Vec<Bar>,
}

#[derive(Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename = "bar")]
struct Bar{

}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn deserialize_trivial_string_test() {
        let fs = "<foo><bar/><bar/></foo>";
        let foo = from_str(fs).unwrap();
        assert_eq!(Foo { bars: vec![Bar {}, Bar {}] }, foo);
    }

    #[test]
    fn serialize_trivial_string_test() {
        let foo = Foo { bars: vec![Bar {}, Bar {}] };
        let fs = to_string(&foo).unwrap();
        assert_eq!("<foo><bar/><bar/></foo>", fs);
    }
}

并且不要忘记激活序列化功能:
[dependencies.quick-xml]
version = "0.18.1"
features = ["serialize"]

我可以反序列化就好了,但是序列化添加了一个额外的<bar>标记,将bars字段包装为实际的<bar>标记:
<Foo>
    <bar>
        <bar></bar>
        <bar></bar>
    </bar>
</Foo>
#[serde(rename = "bar", default)]字段上的bars是我基于quick-xml's documentation修复此问题的首次尝试,但显然不起作用。我还仔细阅读了Serde的文档,并确实找到了flatten属性,但是当我尝试将其应用于bars字段时,它似乎不起作用。

除了手动实现Deserialize之外,还有什么方法可以获得我需要的序列化?

如果相关,我尝试使用的实际数据格式为flam3 file format。有一个示例文件here。此处的<flame>元素等效于<foo>,而<xform>等效于<bar>

最佳答案

不幸的是你不能。有一个outstanding issue on GitHub可以解决您的问题。

关于xml - 使用serde序列化结构时,如何展平 `Vec`字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62363984/

相关文章:

java - 当使用另一个按钮 - HYBRIS 进行操作时,如何禁用后台中的按钮?

testing - 在文档测试中使用本地模块时出错

json - 使用 serde_json 序列化带有非字符串键的映射

rust - 无法使 Serde Serialize 工作的基本示例

rust - 使用 serde 序列化时如何对 HashMap 键进行排序?

javascript - 对 document.documentElement 感到困惑

python - 如何使用 Beautiful Soup 从 xml 标签中提取属性?

macos - 如何将 Rust 应用程序从 macOS x86 交叉编译到 macOS Silicon?

rust - 我如何从 Rust 调用原始地址?

android - 如何修复 android studio 中的“加密 xml 问题”或“不知道这是什么”