【发布时间】:2021-10-23 19:29:29
【问题描述】:
我已成功使用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>
}
然后我在Foo 上实现了FromStr 和Display,它们分别调用serde_json::from_str 和serde_json::to_string,以轻松(反)序列化结构。
但是,我现在还想使用 serde_ini 来支持(反)序列化 INI 文件,以使用相同的 Rust 数据结构。但我真的不知道该怎么做。
结构本身很简单,但我的具体问题是属性:
- 键在 JSON 和 INI 格式中的命名不同(JSON 格式使用习惯的驼峰式,而 INI 没有),所以我必须以其他方式解决
#[serde(rename)]和#[serde(rename_all)]属性,但是我不确定在哪里或如何。 -
#[serde(flatten)]doesn't seem to work 和serde_ini的全字符串值,所有非字符串值都需要#[serde(deserialize_with="from_str)]"属性,但这显然只适用于 INI 值,而不适用于 JSON 值。
总而言之,我想我需要做的是重新实现这些属性,或者根据使用的 (De)Serializer 有条件地使用它们,但我不知道该怎么做。
【问题讨论】:
-
我了解
#[serde(alias)]可以用于从多种格式反序列化,但不能用于序列化。 -
那不可能,如果不使用相同的密钥,两种格式规范是不兼容的。这应该作为两个结构来实现。
-
这是去年I was looking into 的东西;最终我关注了@dtolnay 的advice to pass context to the
Serializevia a thread local。