首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对两种(反)序列化格式使用serde

对两种(反)序列化格式使用serde
EN

Stack Overflow用户
提问于 2021-10-23 19:29:29
回答 1查看 1.2K关注 0票数 6

我已经成功地使用serde_json来反序列化和序列化JSON。我的设置看起来有点像(非常简化):

代码语言:javascript
复制
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>
}

然后,我在FromStrDisplay上实现了Foo,它们依次调用serde_json::from_strserde_json::to_string,以方便地(反)序列化结构。

不过,我现在还想使用serde_ini来支持(反)序列化INI文件,使其具有相同的Rust数据结构。但我真的想不出该怎么做。

结构本身很简单,但我的具体问题是属性:

  • 这些键在JSON和INI格式中的命名方式不同( JSON格式使用习惯的camelCase,而INI不使用),因此我必须以其他方式解决#[serde(rename)]#[serde(rename_all)]属性,但我不确定在哪里或如何解决。
  • #[serde(flatten)] 似乎不起作用具有serde_ini的全字符串值,它要求对所有非字符串值都使用#[serde(deserialize_with="from_str)]"属性,但这显然只适用于INI值,而不是JSON值。

总之,我想我需要做的是重新实现这些属性,或者根据使用(反)序列化程序的内容有条件地使用它们,但是我很难理解如何做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-23 20:10:33

这是serde设计的一个限制。DeserializeSerialize实现是有意与SerializerDeserializer实现分离的,这在选择不同格式并交换它们时提供了极大的灵活性和方便。不幸的是,这意味着不可能单独微调不同格式的DeserializeSerialize实现。

我以前这样做的方法是复制数据类型,以便为每种格式配置它们,然后提供它们之间的零成本转换。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69691366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档