gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:39:29 28 4
gpt4 key购买 nike

我有一些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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com