如何解决自定义结构的多个serde :: Serialize实现
免责声明:我是一个生锈的初学者!
假设我具有以下结构,并且我希望从派生的Serialize
特性中获得默认的json序列化
#[derive(Serialize)]
struct Address {
zip:usize,street: String,}
#[derive(Serialize)]
struct Person{
name: String,age: usize,address: Address
}
此外,我为旧式格式实现了自定义serde::Serializer
,该格式采用任何Serialize
并在遇到嵌套结构,枚举等时内部转发到serialize
方法。
struct MySerializer {...}
impl Serializer for MySerializer {...}
此外,我定义了一个自定义特征MyFormat
,该特征扩展了Serialize
的特征,并应该用作标签或其他东西,即MySerializer
遇到实现{{1}的东西},则不应使用MyFormat
,而应使用Serialize
。
MyFormat
现在的问题是,当我使用自定义序列化程序时,我可以在最外层控制是否使用派生的trait MyFormat: Serialize {
/// by default just use the normal Serialize trait method.
fn serialize<S>(&self,serializer: S) -> Result<S::Ok,S::Error>
where
S: Serializer,{
Serialize::serialize(&self,serializer)
}
}
impl MyFormat for Address {
fn serialize<S>(&self,serializer: S) -> Result<<S as Serializer>::Ok,<S as Serializer>::Error>
where
S: Serializer,{
// this can actually look much more complicated,e.g. some additional mapping will be done here.
serializer.serialize_some(&self.zip)?;
serializer.serialize_some(&"some extra field only present in this format")?;
serializer.serialize_some(&self.street)?
}
}
impl MyFormat for Person {}
,但是,当我下降到结构,Serialize
特征期望使用特征方法规范中的Serializer
类型,我不能缩小到Serialize
,因为这会违反特征。
在上面的示例中,MyFormat
和name
可以,因为基本类型的格式相同,但是,嵌套的age
如果进行序列化,可能需要“注入”一些其他字段到Address
。
我想我只是想念一些范式,可以让我用锈特质来做到这一点。在C ++中,我可以使用模板专门化或SFINAE。有什么铁锈可以解决这种问题?
亲切的问候, 马蒂
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。