Java序列化又称为“持久化”。指将某个特定的对象写入到磁盘中。序列化后的对象是以二进制字节码的形式存在的。
序列化的作用:
1、对象是生存在JVM进程中的,对象的生命周期一定比JVM生命周期短,当有些对象需要长久保存时,需要用到序列化,将对象存储起来。
2、进行网络传输时,数据只能按照二进制形式进行传输,所以需要先序列化为字节码,再进行传输。
什么对象能进行序列化操作:
1、String类、数组类型、Enum类型可以进行序列化
2、实现了Serializable接口的类可以进行序列化
基本序列化操作:
public class Alin implements Serializable{
private static final long serialVersionUID = 1L;
private int num;
private String name;
Alin(){
num = 0;
name = "a";
}
Alin(int num,String name){
this.num = num;
this.name = name;
}
@Override
public String toString() {
return "num: "+num+"name: "+name;
}
}
public class SerTest {
public static void main(String[] args) {
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
Alin testA = new Alin(2,"b");
oos.writeObject(testA);
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
Alin testB = (Alin)ois.readObject();
System.out.println(testB);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
输出:num: 2name: b
可见,通过oos.writeObject(testA);可以进行序列化操作,通过Alin testB = (Alin)ois.readObject();可以实现反序列化操作。
序列化的控制:
1、被static transient 关键字修饰的成员不能被序列化。当反序列化时,会对这些成员赋默认值。
2、可以通过实现Externalizable方法而非Serializable来实现序列化的控制。Externalizable中多了两个方法的声明:
private void writeObject(ObjectOutputStream stream) throws IOException;
private void readObject(ObjectInputStream stream) throws IOException,ClassNotFoundException;
在我们进行序列化和反序列化时,在调用ObjectOutputStream.writeObject()或者ObjectInputStream.readObject()时,会发现该目标类已经写了两个对应方法,所以便会执行类中的这两个方法,从而实现只序列化自己想进行序列化的内容。
3、当要序列化的对象里包含另一个对象的引用时,序列化该对象,对象内的引用对应的对象也会被序列化,即序列化的是整个“对象网”,当然,如果该引用对应的对象类型没有继承Serializable接口的话,会报异常。即要序列化的对象内的所有引用都应该是继承了Serializable接口的。