1.定义
序列化(Serializable):序列化就是指把内存中的对象变成二进制流的形式进行传输或者保存在文本中。就是我这里写了一个类要发给你,我发给你的不可能直接是这个类,而是这个类经过编码后的字节码。
2.实现
一个类若是想实现序列化必须要实现Serializable接口。
Serializable接口的源码如下:源码里除过一堆注释,就只有这么一句代码
public interface Serializable {
}
像这样的接口,我们就叫它标识接口。它就是一个标识,当类实现了这个接口,它就被打上了一个标识,标识该类具有序列化的能力。我们后面讲到深浅拷贝时Cloneable也是一个标识接口。
3. 序列化与反序列化操作
要想实现对象的序列化与反序列化操作,需要使用IO包提供的两个类:
ObjectOutputStream、ObjectInputStream
对象的序列化输出(序列化类):ObjectOutputStream
public ObjectOutputStream(OutputStream out) throws IOException
:选择目标终端
public final void writeObject(Object obj) throws IOException
:将obj变为二进制流输出到目标终端
对象的序列化输入(反序列化类):ObjectInputStream
public ObjectInputStream(InputStream in) throws IOException
:选择目标终端
public final Object readObject() throws IOException
:将二进制流反序列化对象
看一个例子:
import java.io.*;
class Person implements Serializable {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Main {
public static void main(String[] args) throws Exception{
// Person per = new Person("张三",18);
File file = new File("C:\\Users\\Administrator\\Desktop\\Test.txt");
// 序列化
// OutputStream outputStream = new FileOutputStream(file);
// ObjectOutputStream obp = new ObjectOutputStream(outputStream);
// obp.writeObject(per);
// obp.close();
// 反序列化
InputStream inputStream = new FileInputStream(file);
ObjectInputStream obi = new ObjectInputStream(inputStream);
Person per = (Person) obi.readObject();
System.out.println(per);
}
}
上述代码序列化与反序列化结果如下:
4. transient关键字
当我们不希望类中的某些属性被序列化时,我们可以在其前面加上一个transient关键字,表示该属性不能被序列化。
我们在上面的例子中,假如不希望age属性被序列化,我们只在代码的age前加上transient,结果就变了。看看运行结果:
从序列化后的文字多少都能看出来被序列化的属性变少了