对象在网络中如何传输(计算机网络中都是使用二进制)
程序员文章站
2022-07-09 19:16:25
为什么要序列化因为在网络中传输的数据只能是二进制。序列化就是将对象转换成二进制,反序列化就是讲二进制转化为对象的过程。常见的序列化JDK原生序列化方式JSONHessianProtobuf如何选择序列化方式RPC框架的性能和效率序列化协议的通用性和兼容性序列化协议的安全性RPC使用过程中注意哪些问题对象要尽量简单,没有太多的依赖关系入参和返回值体积不要太大尽量使用简单的、常用的原生对象。对象不要有复杂的继承关系。......
为什么要序列化
因为在网络中传输的数据只能是二进制。序列化就是将对象转换成二进制,反序列化就是讲二进制转化为对象的过程。
常见的序列化
JDK原生序列化方式
public class Student implements Serializable { private int number; private String name; public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student{" + "number=" + number + ", name='" + name + '\'' + '}'; } public static void main(String[] args) throws IOException, ClassNotFoundException { String home=System.getProperty("user.home"); String basePath=home+"/Desktop"; FileOutputStream fos=new FileOutputStream(basePath+"student.text"); Student student=new Student(); student.setName("wangkai"); student.setNumber(1); ObjectOutputStream oos=new ObjectOutputStream(fos); oos.writeObject(student); oos.flush();; oos.flush(); FileInputStream fis=new FileInputStream(basePath+"student.text"); ObjectInputStream ois=new ObjectInputStream(fis); Student student1=(Student) ois.readObject(); ois.close(); System.out.println(student1); } }
JDK的序列化过程如下
序列化过程就是在读取对象数据的时候,不断的加入一些特殊分隔符,这些特殊分隔符在反序列化中使用。
JSON
基于HTTP的RPC通信框架会采用JSON格式,存在以下问题
- JSON序列化的额外空间开销比较大,对于大数据量服务这意味着巨大的内存和磁盘开销
- JSON没有类型,像Java这种强类型语言,需要反射统一解决,性能不太好
Hessian
是动态类型、二进制、紧凑的、可跨语言移植的一种序列化框架。Hessian协议要比JDK、JSON更加紧凑,性能要比JDK、JSON序列化高效很多,而且生成的字节数也更小。
存在问题
主要集中在对Java一些常见类型不支持
- linked系列 Locale类
- Byte/Short反序列化为Integer
Protobuf
Google内部的混合语言数据标准,Protobuf使用的时候需要定义IDL文件,使用不用语言的IDL编译器,生成序列化工具类。
- 序列化体积比JSON、Hessian要小
- IDL能清晰的描述语义
- 序列化、反序列化速度很快,不需要反射获取类型
- 消息格式升级和兼容性不错,可以做到向后兼容。
Protostuff
不需要依赖IDL文件,直接对Java对象领域对象进行序列化操作,是一个Java版本的Protobuf序列化框架。需要注意
- 不支持null
- 不支持淡村的Map、List集合对象,需要包在对象里。
如何选择序列化方式
- RPC框架的性能和效率
- 序列化协议的通用性和兼容性
-
序列化协议的安全性
RPC使用过程中注意哪些问题
- 对象要尽量简单,没有太多的依赖关系
- 入参和返回值体积不要太大
- 尽量使用简单的、常用的原生对象。
- 对象不要有复杂的继承关系。
序列化框架的本质就是一个序列化的协议,将对象的类型、属性、属性值按照归你管的格式写到二进制流中来完成序列化,再按照固定的格式读出对象的类型、属性类型、属性值,通过这类信息重新创建出一个新的对象,来完成反序列化。
本文地址:https://blog.csdn.net/qq_23864697/article/details/108032829