Serialization 自定义结构的多个serde::序列化实现
免责声明:我是生锈的初学者 假设我有以下to结构,并且我希望从派生的Serialization 自定义结构的多个serde::序列化实现,serialization,rust,serde,Serialization,Rust,Serde,免责声明:我是生锈的初学者 假设我有以下to结构,并且我希望从派生的Serializetraits中获得默认的json序列化 #[导出(序列化)] 结构地址{ zip:usize, 街道:弦, } #[导出(序列化)] 结构人{ 名称:String, 年龄:使用, 地址:地址 } 此外,我还为遗留格式实现了一个自定义的serde::Serializer,它接受任何Serialize,并在遇到嵌套结构、枚举等时在内部转发到Serialize方法 结构MySerializer{…} MySer
Serialize
traits中获得默认的json序列化
#[导出(序列化)]
结构地址{
zip:usize,
街道:弦,
}
#[导出(序列化)]
结构人{
名称:String,
年龄:使用,
地址:地址
}
此外,我还为遗留格式实现了一个自定义的serde::Serializer
,它接受任何Serialize
,并在遇到嵌套结构、枚举等时在内部转发到Serialize
方法
结构MySerializer{…}
MySerializer{…}的impl序列化程序
此外,我定义了一个自定义traitMyFormat
,它扩展了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。铁锈中有什么东西可以解决这种问题吗
亲切问候,,
马蒂