首页 > 其他分享 >Rust Serde 反序列化的概念

Rust Serde 反序列化的概念

时间:2023-01-19 20:04:17浏览次数:56  
标签:返回 Serde next seed fn key Deserializer 序列化 Rust

这几天在捣鼓Serde::Deserializer,发现有一点难理解。死磕了7、8小时后,算是明白了它的原理。

如果你也想自己捣鼓,你可以试著把下列两个网址所有代码(代码是以1个简单json反序列化的例子来举例说明Deserializer怎么用)复制到Idea或vscode等ide,在想要跟踪的地方设断点或打印信息,然后运行代码中的测试用例,多运行几天就能够逐渐理解Deserializer怎么用:

下面我试著写一下它的原理,帮助后来者:


  • 假设我想要透过调用new_instance::<T>()->T,期望它返回T类的实例(T类的字段,凡是数字的设为0,bool设为false,String设为"".to_owned(),其它类则递归地返回它的实例)。则new_instance()代码如下图(1)所示:

Rust Serde 反序列化的概念_deserializer

  • 上图(1)被调用后,运行到T::deserialize(&mut deserializer)后,Deserializer的fn deserialize_struct(fields)首先被调用,如上图(2)所示;在fn deserialize_struct(fields)中可以取到T的struct名称(name: &str)及所有字段名(fields: &[&str]);我第1次尝试到这里就卡壳了;请继续看下去:
  • 接下来,我们希望一个字段一个字段地(不需要按字段顺序)返回该字段的类型和值,怎么办呢?需要借助一个实现de::MapAccess的MapAccesses类,这个类只有两个方法fn next_key_seed() 和 fn next_value_seed();
  • 当执行到visitor.visit_map(MapAccesses::new(self)),会将Deserializer自己传入MapAccesses中,然后反复调用next_key_seed()及next_value_seed(),如上图(3)所示,直到next_key_seed返回Ok(None)停止;
  • 从函数名可以判断出next_key_seed()及next_value_seed()分别要返回字段类型及字段值,问题是它们分别返回泛型K::Value和V::Value,不太容易理解它们是什么!?

未完待续………


标签:返回,Serde,next,seed,fn,key,Deserializer,序列化,Rust
From: https://blog.51cto.com/oldycat/6020133

相关文章

  • 【Django drf】 序列化类常用字段类和字段参数 定制序列化字段的两种方式 关系表外键
    目录序列化类常用字段类和字段参数常用字段类常用字段参数选项参数通用参数序列化类高级用法之sourcesource填写类中字段source填写模型类中方法source支持跨表查询定制序......
  • Java反序列化-URLDNS利用链分析
    前言URLDNS链是Java反序列化中比较简单的一个链子,由于URLDNS不依赖第三方包和不限制jdk版本,所以经常用于检测反序列化漏洞。URLDNS并不能执行命令,只能发送DNS请求。(应该......
  • Rust语言体验
    保命声明:笔者代码能力有限,若行文中有错漏之处欢迎大家指出。Rust语言一门赋予每个人构建可靠且高效软件能力的语言。Rust速度惊人且内存利用率极高。由于没有运行时和垃......
  • drf-Response drf-request.data 序列化类的使用 反序列化新增、修改、删除数据
    目录APIView基本使用使用原生Django写接口(View+JsonResponse)使用drf写接口(APIView+drfResponse)drf两种导入View的方式drfResponseAPIView源码分析Request类源码......
  • Java反序列化-CommonsCollections1利用链分析
    前言学习Java基础语法也有1年多的时间了,Java安全基础也学了有半年了,期间通过ctf赛题学习过fastjson的反序列化并了解了其利用链,但并未深入学习并记录笔记。一直都说要赶......
  • 序列化与反序列化
    序列化与反序列化最近在读麦叔的“python3分钟”,麦叔花了4篇的篇幅来介绍序列化与反序列化,加之本来对序列化的理解就比较含糊,因此今天打算系统的把序列化与反序列化梳理......
  • django获取多对多关系表中字段返回以及序列化器中传参解决方案
    djangohowcanimakeaserializerwithrelationtablefieldhttps://stackoverflow.com/questions/53137077/django-rest-framework-serializer-with-field-from-rela......
  • RMI和JNDI反序列化知识点回顾
    RMI介绍RMI(RemoteMethodInvocation)远程方法调用,就是可以使远程函数调用本地函数一样方便,因此这种设计很容易和RPC(RemoteProcedureCalls)搞混。区别就在于RMI是Ja......
  • FlinkCDC的自定义反序列化
    FlinkCDC的自定义反序列化FlinkCDC的简单使用方法packagecom.pzb;importcom.ververica.cdc.connectors.mysql.MySqlSource;importcom.ververica.cdc.connectors.my......
  • C++ 序列化和反序列化
    序列化1、背景1、在TCP的连接上,它传输数据的基本形式就是二进制流,也就是一段一段的1和0。2、在一般编程语言或者网络框架提供的API中,传输数据的基本形式是字节,也就是Byte......