最简serde反序列化实现示例及核心调用方法问询
如何用自定义Visitor将String反序列化为MyStruct?
你已经实现了serde的Visitor trait,要完成String到MyStruct的反序列化,有两种实用的方式:
方式一:手动实现MyStruct的Deserialize trait(推荐)
首先去掉MyStruct上自动生成的#[derive(Deserialize)],手动实现Deserialize trait,把你的MyVisitor关联进去:
#[derive(Debug)] struct MyStruct { something: u32, } impl<'de> serde::Deserialize<'de> for MyStruct { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: serde::Deserializer<'de>, { // 告诉反序列化器用我们的Visitor处理字符串类型 deserializer.deserialize_str(MyVisitor) } }
之后在main里就能像常规反序列化一样调用,比如用serde_json处理字符串:
let my_value: MyStruct = serde_json::from_str(&my_string).unwrap();
或者直接用字符串的deserialize方法:
let my_value: MyStruct = my_string.deserialize().unwrap();
方式二:直接用Visitor配合Deserializer实例
如果不想修改MyStruct的反序列化实现,也可以直接创建字符串对应的Deserializer实例,调用它的方法传入Visitor:
use serde::de::Deserializer; let my_value: MyStruct = serde_json::Deserializer::from_str(&my_string) .deserialize_str(my_visitor) .unwrap();
为什么之前的尝试不生效?
你之前写的MyStruct::deserialize(my_string)之所以不行,是因为自动derive的Deserialize是按照结构体的字段结构(比如期望一个JSON对象)来反序列化的,和你自定义的Visitor处理字符串的逻辑不匹配,必须手动把Visitor和MyStruct的反序列化逻辑绑定起来。
内容的提问来源于stack exchange,提问作者jka
相关产品推荐
相关产品推荐

