概念
说到Java,万物皆对象。对象,是一个比较抽象的概念,他就是类存活在内存中的一个实例,有状态和行为,一旦JVM停止运行,对象的状态也会随之丢失。那么如何将这个对象当前状态进行一个记录,使其可以进行存储和传输呢?这就要用到序列化了。
-
序列化(Serialization)
把对象转换为字节序列的过程称为对象的序列化,把对象的状态保持下来,写入到磁盘或者其他介质中。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。 -
反序列化(Deserialize)
把字节序列恢复为对象的过程称为对象的反序列化,把已存在在磁盘或者其他介质中的对象,读取到内存中,以便后续操作。
Java 对象序列化是 JDK 1.1 中引入的一组开创性特性之一,用于作为一种将 Java 对象的状态转换为字节数组,以便存储或传输的机制,以后,仍可以将字节数组转换回 Java 对象原有的状态。
实际上,序列化的思想是 “冻结” 对象状态,传输对象状态(写到磁盘、通过网络传输等等),然后 “解冻” 状态,重新获得可用的 Java 对象。所有这些事情的发生有点像是魔术,这要归功于 ObjectInputStream
和 ObjectOutputStream
类、完全保真的元数据以及程序员愿意用 Serializable
标识接口标记他们的类,从而 “参与” 这个过程。
Android序列化
Android 序列化有两种方式,实现 Serializable
或 Parcelable
。今天先搞懂 Java 中自带的序列化方式 Serializable
。
Serializable
是 java.io
包中定义的、用于实现 Java 类的序列化操作而提供的一个语义级别的空接口,代码里面除了注释几乎啥也没有,仅仅是个接口:
package java.io;
// Android-added: Notes about serialVersionUID, using serialization judiciously, JSON.
/**
* // 此处省略150行注释...
*
* @author unascribed
* @see java.io.ObjectOutputStream
* @see java.io.ObjectInputStream
* @see java.io.ObjectOutput
* @see java.io.ObjectInput
* @see java.io.Externalizable
* @since JDK1.1
*/
public interface Serializable {
}
既然啥都没有,实现序列化和反序列化为什么要实现 Serializable
接口?
在Java中实现了 Serializable
接口后,JVM 会在底层帮我们实现序列化和反序列化,如果我们不实现Serializable接口,那自己去写一套序列化和反序列化代码也行,至于具体怎么写,Google一下你就知道了。
只要我们实现 Serializable
接口,那么这个类就可以被 ObjectOutputStream
转换为字节流,也就是进行了序列化。那么就来走一把,创建个简单的学生对象,有年龄、姓名和地址等属性。
public class Student implements Serializable {
//private static final long serialVersionUID = 1L;
private static String FLAG = "9527";// 静态属性
private int age;
private String name;
private String address;
transient private String car;// 忽略序列化
//private String addTip;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getCar() {
return car;