如何避免Serde需要默认特质来跳过序列化的字段?

11

我有一个结构体,是通过Serde反序列化创建的。我想在其中添加一个类型为Url的字段,但该字段不需要被反序列化:

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

Playground

Serde抱怨Url未满足Default特征。我已经尝试使用和不使用派生Default,但都不行。那么,我唯一的选择是自己实现UrlDefault特征吗?


2
如果source没有被反序列化,当反序列化一个Flow时,Serde应该将什么放入其中? - Jmb
是的,我理解这个需求。我只是在想最好的遵循方式:是要求Url实现默认值(一个增强请求),还是有某种推导它的方法?或者我必须为Url实现默认值,或者使用其他解决方案。 - Andrew Mackenzie
1
你需要为 Flow 实现 Default,而不是 Url,因为你不能为不属于当前 crate 的类型实现不属于当前 crate 的 traits。为了使 Url 实现 Default,需要修改 url crate。 - Joe Clay
4
你可以使用 Option<Url> 替代。 - Grégory OBANOS
我曾考虑过Option作为一种解决方法,只是该字段(后来)不是可选的 - 但这是可能的。谢谢你提醒我。 - Andrew Mackenzie
2个回答

13

您可以在字段上使用#[serde(default = "path")],为其指定一个带有签名fn() -> Url 的函数,在该字段缺失时应该调用它。


1
听起来很有趣 - 让我看看我能否使用它! - Andrew Mackenzie
1
我想解决我的问题有多种方法,但这个方法需要的额外代码最少,将大部分(可能的)工作委托给serde,并且最明显的是额外的东西是用来做什么的 - 所以选择它作为答案。谢谢。 - Andrew Mackenzie

1

当然,我想避免这样做并利用Serde进行反序列化。谢谢你提醒我。 - Andrew Mackenzie
1
当然,这是最不方便的选择,但也是最灵活的选择(而且经常被忽视,所以我只是想为了完整性而提一下)。 - Zargony
嗯...看起来我可能需要这样做,因为我正在反序列化一些包含相对URL的文件,所以我需要设置Url::parse()的基础路径,将它们反序列化为绝对URL。 - Andrew Mackenzie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接