当前位置:网站首页>APP为什么用JSON协议与服务端交互:序列化相关知识
APP为什么用JSON协议与服务端交互:序列化相关知识
2022-07-29 14:31:00 【InfoQ】
序列化理论包含的三个方面
- 序列化定义;
- 序列化在通信协议中的地位;
- 序列化组件
1. 序列化问题是怎么产生的(序列化的定义)
- 序列化: 将数据结构或对象转换成二进制串
- 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或对象
2. 序列化在通信协议中的地位
- OSI七层协议模型,序列化位于展示层(Presentation Layer)
- 在TCP/IP协议中,序列化位于应用层。
3. 序列化和反序列化的组件
- IDL文件(Interface description language)。参与通讯的各方需要对通讯的内容做相关约定。为了与语言和平台无关,这个约定需要采用与编程语言、平台无关的语言来进行描述。这种语言被称为接口描述语言(IDL),采用IDL撰写的协议约定称为IDL文件。
- IDL Compiler:IDL文件中的约定需要一个编译器,将IDL文件转换成各编程语言的动态库。
- Stub/Skeleton Lib:负责序列化和反序列化工作的代码。Stub是一段部署在客户端的代码,一方面接收应用层的参数,并对其序列化后通过底层协议栈发送到服务端;另一方面接收服务端序列化后的结果数据,反序列化后交给应用层;Skeleton部署在服务端,其功能与Stub相反,从传输层接收序列化参数,反序列化后交给服务端应用层,并将应用层的执行结果序列化后最终传送给客户端。


序列化协议的考虑点
- 支持哪些编程语言,能否跨语言
- 支持哪些平台,是否跨平台(例如支持哪些硬件架构、操作系统)
- 流行程度(序列化涉及通信双方,冷门的序列化协议需要的学习成本很高)
- 健壮性/鲁棒性
- 成熟程度(这个协议是否经历大量全面的测试、真实世界系统的检验,长期稳定运行)
- 是否简单易用
- 调试难度、可读性(序列化和反序列化的数据正确性和业务正确性的调试往往需要很长时间,良好的调试机制大大提高开发效率。序列化后的二进制串往往不具备人眼可读性,为了验证序列化结果的正确性,写入方不得不同时撰写反序列化程序,或提供一个查询平台–这比较费时;另一方面,如果读取方未能成功实现反序列化,难以确定是自身反序列化程序bug导致的还是写入方写入了错误序列化数据导致的。如果序列化后的数据人眼可读,这将大大提高调试效率, 例如XML和JSON就具有人眼可读的优点。)
- 空间性能(Verbosity),即序列化以后的数据所占用的空间大小。
- 时间性能(Complexity)。复杂的序列化协议会导致较长的解析时间,这可能使得序列化和反序列化成为系统瓶颈。
- 扩展性/兼容性。新增字段是否容易。业务系统需求的更新周期快,新需求不断涌现。如果序列化协议具有良好的可扩展性,支持自动增加新的业务字段,而不影响老的服务,这将大大提供系统的灵活度。
- 安全性/访问限制。例如阿里的fastjson经常有安全性问题。
- 文档。
已知的序列化协议
XML序列化协议

SOAP序列化协议


JSON序列化协议
- 公司之间传输数据量相对小,实时性要求相对低(例如秒级别)的服务。
- 基于Web browser的Ajax请求。
- 由于JSON具有非常强的前后兼容性,所以它适用于:接口经常发生变化,对可调式性要求高的场景,例如Mobile app与服务端的通讯(移动APP为什么要用JSON协议与服务端交互)。
- JSON的典型应用场景是JSON+HTTP,适合跨防火墙访问。
Thrift序列化协议

Protobuf序列化协议
- 提供了标准的IDL和IDL编译器,对工程师非常友好。
- 序列化数据简洁紧凑,其序列化之后的数据量约为XML的1/3到1/10。
- 解析速度非常快,比XML快约20-100倍。
- 提供了友好的动态库,使用非常简洁,反序列化只需要一行代码。
- Protobuf IDL文件对于各个参与方业务产生了强力的约束
- Protobuf与传输层无关,采用HTTP,具有良好的跨防火墙访问属性。

Hessian序列化协议
Avro序列化协议

序列化协议Benchmark


序列化协议的选型
边栏推荐
猜你喜欢

The reason for Apple's official price reduction has been found, and it is also facing declining sales and even inventory problems

Realization of Online Chat System Based on SSM

如何获取本地json

WOLFLAB一方老师为什么要写网络虚拟化《VMware NSX-T卷2》路由架构-2

基于JSP&Servlet实现的众筹平台系统

2022开放原子全球开源峰会数据库分论坛圆满召开

kubernetes cks strace etcd

The raised platform system based on JSP&Servlet implementation

AQS源码阅读与强软弱虚4种引用以及ThreadLocal原理与源码

web会话管理与xss攻击
随机推荐
基于C语言实现一个社交系统
什么是异构计算
Couldn‘t create temporary file /tmp/apt.conf.uko4Kd for passing config to apt-key
【表达式计算】表达式计算问题的通用解法(练习加强版,含总结)
数字孪生万物可视 |联接现实世界与数字空间
C语言 5:bool类型,关系表达式,逻辑表达式,分支语句,函数调用机制,break,continue,goto,return/exit跳转语句
软件测试架构师的工作日常
文本处理之xml
【IIC通信】Chap.1(I2C)IIC通信原理、IIC读写时序详解
工业设备数字孪生技术,解决方案系统平台案例
Nacos基础教程
正则、grep/egrep、sed、awk
mysql datetime格式化日期(mysql start with)
打卡广汽本田喜悦安全驾驶中心,体验最刁钻的场地训练
求教一下 现在最新版的flinkcdc能获取到oracle的ddl变更信息吗?
Google Cloud X Kyligence|如何从业务视角管理数据湖?
第4章_2——视图的使用
Introduction to several methods of making custom welcome interface on Weiluntong touch screen
【IIC通信】Chap.2 (I2C)IIC协议的特点;为什么IIC需要开漏输出、上拉电阻?
从一道面试题说起:GET 请求能传图片吗?