Serialization 自定义结构的多个serde::序列化实现

Serialization 自定义结构的多个serde::序列化实现,serialization,rust,serde,Serialization,Rust,Serde,免责声明:我是生锈的初学者 假设我有以下to结构,并且我希望从派生的Serializetraits中获得默认的json序列化 #[导出(序列化)] 结构地址{ zip:usize, 街道:弦, } #[导出(序列化)] 结构人{ 名称:String, 年龄:使用, 地址:地址 } 此外,我还为遗留格式实现了一个自定义的serde::Serializer,它接受任何Serialize,并在遇到嵌套结构、枚举等时在内部转发到Serialize方法 结构MySerializer{…} MySer

免责声明:我是生锈的初学者

假设我有以下to结构,并且我希望从派生的
Serialize
traits中获得默认的json序列化


#[导出(序列化)]
结构地址{
zip:usize,
街道:弦,
}
#[导出(序列化)]
结构人{
名称:String,
年龄:使用,
地址:地址
}
此外,我还为遗留格式实现了一个自定义的
serde::Serializer
,它接受任何
Serialize
,并在遇到嵌套结构、枚举等时在内部转发到
Serialize
方法


结构MySerializer{…}
MySerializer{…}的impl序列化程序
此外,我定义了一个自定义trait
MyFormat
,它扩展了
Serialize
trait,并且应该作为标记或其他东西来工作,即如果
MySerializer
遇到实现
MyFormat
的东西,它不应该使用
Serialize
,而是使用
MyFormat

trait MyFormat:序列化{
///默认情况下,只需使用普通的serializetrait方法。
fn序列化(&self,序列化程序:S)->结果
哪里
S:序列化程序,
{
Serialize::Serialize(&self,serializer)
}
}
地址的impl-MyFormat{
fn序列化(&self,序列化程序:S)->结果
哪里
S:序列化程序,
{
//这实际上可能看起来更复杂,例如,这里将进行一些额外的映射。
serializer.serialize_some(&self.zip)?;
serializer.serialize_some(&“某些额外字段仅在此格式中存在”)?;
序列化程序。序列化(self.street)(&self.street)?
}
}
个人{}的impl MyFormat
现在的问题是,当我使用自定义序列化程序时,我可以在最外层控制是否使用派生的
序列化
,但是,当我进入结构时,
Serializer
trait需要trait方法规范中的
Serialize
类型,我不能将其缩小到
MyFormat
,因为这会违反trait

在上面的示例中,
name
age
是可以的,因为基本类型的格式是相同的,但是,嵌套的
地址
如果序列化为
MyFormat
,可能需要“注入”一些额外的字段

我想我只是错过了一些范例,让我可以用铁锈的特性来做这件事。在C++中,我可以使用模板特化或SFIEAE。铁锈中有什么东西可以解决这种问题吗

亲切问候,, 马蒂