我已经成功地使用serde_json来反序列化和序列化JSON。我的设置看起来有点像(非常简化):
use serde::{Deserialize, Serialize};
use serde_json;
use serde_with::skip_serializing_none;
#[skip_serializing_none]
#[derive(Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
struct Foo {
#[serde(flatten)]
bar: Option<Bar>,
baz_quux: Option<u8>,
}
#[skip_serializing_none]
#[derive(Deserialize, Serialize)]
struct Bar {
#[serde(rename = "plughXyzzySomeRandomStuff")]
plugh_xyzzy: Option<u8>
}然后,我在FromStr和Display上实现了Foo,它们依次调用serde_json::from_str和serde_json::to_string,以方便地(反)序列化结构。
不过,我现在还想使用serde_ini来支持(反)序列化INI文件,使其具有相同的Rust数据结构。但我真的想不出该怎么做。
结构本身很简单,但我的具体问题是属性:
#[serde(rename)]和#[serde(rename_all)]属性,但我不确定在哪里或如何解决。#[serde(flatten)] 似乎不起作用具有serde_ini的全字符串值,它要求对所有非字符串值都使用#[serde(deserialize_with="from_str)]"属性,但这显然只适用于INI值,而不是JSON值。总之,我想我需要做的是重新实现这些属性,或者根据使用(反)序列化程序的内容有条件地使用它们,但是我很难理解如何做到这一点。
发布于 2021-10-23 20:10:33
这是serde设计的一个限制。Deserialize和Serialize实现是有意与Serializer和Deserializer实现分离的,这在选择不同格式并交换它们时提供了极大的灵活性和方便。不幸的是,这意味着不可能单独微调不同格式的Deserialize和Serialize实现。
我以前这样做的方法是复制数据类型,以便为每种格式配置它们,然后提供它们之间的零成本转换。
https://stackoverflow.com/questions/69691366
复制相似问题