这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战
概念
-
由于在系统底层,数据的传输形式是简单的字节序列形式传递,即在底层,系统不认识对象,只认 识字节序列,而为了达到进程通讯的目的,需要先将数据序列化,而序列化就是将对象转化字节序 列的过程。相反地,当字节序列被运到相应的进程的时候,进程为了识别这些数据,就要将其反序 列化,即把字节序列转化为对象
-
无论是在进程间通信、本地数据存储又或者是网络数据传输都离不开序列化的支持。而针对不同场 景选择合适的序列化方案对于应用的性能有着极大的影响。
-
从广义上讲,数据序列化就是将数据结构或者是对象转换成我们可以存储或者传输的数据格式的一 个过程,在序列化的过程中,数据结构或者对象将其状态信息写入到临时或者持久性的存储区中, 而在对应的反序列化过程中,则可以说是生成的数据被还原成数据结构或对象的过程。
-
这样来说,数据序列化相当于是将我们原先的对象序列化概念做出了扩展,在对象序列化和反序列 化中,我们熟知的有两种方法,其一是Java语言中提供的Serializable接口,其二是Android提供的 Parcelable接口。而在这里,因为我们对这个概念做出了扩展,因此也需要考虑几种专门针对数据 结构进行序列化的方法,如现在那些个开放API一般返回的数据都是JSON格式的,又或者是我们 Android原生的SQLite数据库来实现数据的本地存储,从广义上来说,这些都可以算做是数据的序列化
序列化
把Java对象转换为字节序列的过程,或者说将数据结构或对象转换成二进制串的过程。序列化之后它可就不再是对象了
反序列化
把字节序列恢复为Java对象的过程,将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
对象与二进制
在Java中我们所操作的万物皆是对象,来自于对象的实例化。在Java中最接近数据结构的概念是实体类、POJO、JavaBean。
对于跨语言间的通讯,序列化后的数据当然 不能是某种语言的特殊数据类型。二进制串在 Java 里面所指的是 byte[],byte 是 Java 的 8 中原生数据 类型之一(Primitive data types)。
序列化/反序列化的目的
- 序列化: 主要用于网络传输,数据持久化,一般序列化也称为编码(Encode)
- 反序列化: 主要用于从网络,磁盘上读取字节数组还原成原始对象,一般反序列化也称为解码 (Decode)
常见的序列化和反序列化协议
XML&SOAP
XML 是一种常用的序列化和反序列化协议,具有跨机器,跨语言等优点,SOAP(Simple Object Access protocol) 是一种被广泛应用的,基于 XML 为序列化和反序列化协议的结构化消息传递协议
JSON(Javascript Object Notation)
JSON 起源于弱类型语言 Javascript, 它的产生来自于一种称之为”Associative array”的概念,其本质是 就是采用”Attribute-value”的方式来描述对象。实际上在 Javascript 和 PHP 等弱类型语言中,类的描 述方式就是 Associative array。JSON 的如下优点,使得它快速成为最广泛使用的序列化协议之一。
- 这种 Associative array 格式非常符合工程师对对象的理解。
- 它保持了 XML 的人眼可读(Human-readable)的优点。
- 相对于 XML 而言,序列化后的数据更加简洁。 来自于的以下链接的研究表明:XML 所产生序列 化之后文件的大小接近 JSON 的两倍
- 它具备 Javascript 的先天性支持,所以被广泛应用于 Web browser 的应用常景中,是 Ajax 的事 实标准协议。
- 与 XML 相比,其协议比较简单,解析速度比较快。
- 松散的 Associative array 使得其具有良好的可扩展性和兼容性
Protobuf
Protobuf 具备了优秀的序列化协议的所需的众多典型特征。
- 标准的 IDL 和 IDL 编译器,这使得其对工程师非常友好。
- 序列化数据非常简洁,紧凑,与 XML 相比,其序列化之后的数据量约为 1/3 到 1/10。
- 解析速度非常快,比对应的 XML 快约 20-100 倍。
- 提供了非常友好的动态库,使用非常简介,反序列化只需要一行代码。
序列化对象
定义实体类
public class Users implements Serializable {
private String name;
private 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;
}
}
复制代码
public class Client {
public static void main(String[] args) {
Users users = new Users();
users.setAge(18);
users.setName("张三");
try{
FileOutputStream fileOut =
new FileOutputStream("File\user.txt");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(users);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in File\user.txt");
}catch(IOException i)
{
i.printStackTrace();
}
}
}
复制代码
反序列化对象
public class Client {
public static void main(String[] args) {
Users users = null;
try
{
FileInputStream fileIn = new FileInputStream("File\user.txt");
ObjectInputStream in = new ObjectInputStream(fileIn);
users = (Users) in.readObject();
in.close();
fileIn.close();
}catch(IOException i)
{
i.printStackTrace();
return;
}catch(ClassNotFoundException c) {
c.printStackTrace();
return;
}
System.out.println("success......");
System.out.println("Name: " + users.getName());
System.out.println("age: " + users.getAge());
}
}
复制代码