序列化和反序列化
什么是序列化和反序列化
序列化是指将数据结构或者对象转换成二进制串的过程;反序列化则是将二进制串转换成数据结构和对象。
序列化和反序列化主要用网络通讯过程,对应TCP/IP协议的应用层、OSI七层模型的表现层,将应用层的数据转换成二进制进行传输。
Java序列化
- 实现方式
对于要序列化的对象,实现Serializable或者Externalizable接口。通过ObjectInputStream 和 ObjectOutputStream进行序列化和反序列化。
public class Person implements Serializable {
private String name;
//加入关键字,不会被序列化
private transient int age;
public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public int getAge() {
return age;
}public void setAge(int age) {
this.age = age;
}private void writeObject(ObjectOutputStream out) throws IOException {
out.writeObject(name);
out.writeInt(age);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
this.name=(String) in.readObject();
this.age = in.readInt();
}
} public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person = new Person();
person.setName("Jay");
person.setAge(27);
OutputStream outputStream = new FileOutputStream("person.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(person);
outputStream.close();
objectOutputStream.close();
InputStream inputStream = new FileInputStream("person.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Person b = (Person) objectInputStream.readObject();
System.out.println(b.getAge());
System.out.println(b.getName());
- 需要注意的点
1、静态变量不会被序列化
2、Transient关键字修饰的变量不会序列化
3、若父类已实现Serializable接口,则子类可以不用再实现;若父类没有实现Serializable接口,子类实现了Serializable,则父类的属性不会被序列化。
4、允许自定义序列化和反序列化过程,用于实现脱敏和加密;也可以通过自定义方法绕过Transient关键字的约束,如上例所示。
- 可读性
- 通用性:是否支持跨语言,跨平台
- 性能:空间开销,时间开销
2、XML&SOAP
XML是一种常用的序列化和反序列化协议,具有跨机器,跨语言等优点。标准的XML描述格式有两种:DTD(Document Type Definition)和XSD(XML Schema Definition)。
SOAP(Simple Object Access protocol) 是一种被广泛应用的,基于XML为序列化和反序列化协议的结构化消息传递协议。SOAP在互联网影响如此大,以至于我们给基于SOAP的解决方案一个特定的名称--Web service。SOAP协议的主要接口描述语言(IDL)是WSDL(Web Service Description Language)。而WSDL的描述文件是XSD。
3、JSON
JSON起源于弱类型语言Javascript, 它的产生来自于一种称之为"Associative array"的概念,其本质是就是采用"Attribute-value"的方式来描述对象。与XML相比,其协议比较简单,解析速度比较快。
- Jackson
- Gson
- FastJson
Thrift是Facebook开源提供的一个高性能,轻量级RPC服务框架,其产生正是为了满足当前大数据量、分布式、跨语言、跨平台数据通讯的需求。 但是,Thrift并不仅仅是序列化协议,而是一个RPC框架。相对于JSON和XML而言,Thrift在空间开销和解析性能上有了比较大的提升。但是由于Thrift的序列化被嵌入到Thrift框架里面,Thrift框架本身并没有透出序列化和反序列化接口,这导致其很难和其他传输层协议共同使用。
【序列化和反序列化】5、Protobuf
Protobuf具备了优秀的序列化协议的所需的众多典型特征。序列化数据非常简洁,紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10,解析速度非常快,比对应的XML快约20-100倍。但需要专门的Protobuf编译器编译。
推荐阅读
- 急于表达——往往欲速则不达
- 2018-02-06第三天|2018-02-06第三天 不能再了,反思到位就差改变
- 第三节|第三节 快乐和幸福(12)
- 20170612时间和注意力开销记录
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 对称加密和非对称加密的区别
- 眼光要放高远
- 樱花雨
- 前任
- 2020-04-07vue中Axios的封装和API接口的管理