【问题标题】:How to avoid Serde needing the Default trait for a field that skips serialization?如何避免 Serde 需要跳过序列化的字段的默认特征?
【发布时间】:2018-07-03 07:13:52
【问题描述】:

我有这个通过 Serde 反序列化创建的结构,我想在其中有一个 Url 类型的字段,它没有被反序列化:

#[derive(Deserialize, Debug)]
pub struct Flow {
    #[serde(skip_deserializing)]
    pub source: Url,
}

Playground

Serde 抱怨 Url 不满足 Default 特征。我尝试过使用和不使用Default。我自己为Url 实现Default trait 是我唯一的选择吗?

【问题讨论】:

  • 如果source没有反序列化,反序列化Flow时Serde应该放什么?
  • 是的,我理解这种需要。我只是想知道遵守的最佳方法:要求 Url 实现 Default (增强请求),或者有什么方法可以派生它?还是我必须为 Url 或其他解决方案实现默认值。
  • 您必须为Flow 实现Default,而不是Url,如you can't implement traits that aren't local to your crate for types that aren't local to your crate。要使 Url 实现 Default,需要更改 url 板条箱。
  • 您可以改用Option<Url>
  • 我曾考虑将 Option 作为一种解决方法,只是该字段(稍后)不是可选的 - 但这是一种可能性。谢谢你提醒我。

标签: rust serde


【解决方案1】:

您可以在字段上使用#[serde(default = "path")] 来提供带有签名fn() -> Url 的函数,如果该字段丢失,则应调用该函数。

【讨论】:

  • 听起来很有趣 - 让我看看我是否可以使用它!
  • 我猜有多种方法可以解决我的问题,但这是导致额外代码最少的方法,将最多(可能)委托给 serde,并且最明显的是额外的东西是为了什么- 所以选择作为答案。谢谢。
【解决方案2】:

也可以自己implement Deserialize 并适当处理缺失值。

【讨论】:

  • 当然,我想避免这样做并利用 Serde 进行反序列化。不过谢谢你的提及。
  • 当然这是最不方便的选择,但也是最灵活的一种(而且经常被监督,所以为了完整起见,我只想提一下)
  • 嗯...看起来我可能需要走这条路,因为我正在反序列化一些包含相对 url 的文件,所以我需要为 Url::parse() 设置基础将它们反序列化为绝对 url....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
相关资源
最近更新 更多