概念
序列化:将堆内存中的java对象转化成字节数组。
反序列化:将字节数组恢复成java对象。为什么要序列化
- 分布式系统中传输需要。在分布式系统中,要在网络上传输对象,就需要将之转化成二进制。
- 服务器钝化。当服务器发现某些对象长时间不被使用,就会将这些内存中的对象保存到磁盘文件中(Java对象转换为二进制文件)。当服务器发现某些对象需要活动,就会先到内存中查找,如果查找不到,就会到磁盘中查找,并将磁盘中的二进制文件反序列化成对象。
需要注意的地方
- 对象序列化保存的是对象状态,即成员变量。
- 静态成员变量属于类,不属于对象,因此不可序列化
- 用transient标识的成员变量,不参与序列化。在反序列化后,transient标识的成员变量被初始化成初始值,如int初始化成 0 等。
如何实现序列化和反序列化
- 实现序列化接口:Java.lang.Serializable 接口(这是一个标志接口,没有任何抽象方法)
- 使用对象流来完成序列化和反序列化
public class Person implements Serializable{
private String name;
transient 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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
//在根目录下新建一个 io 的文件夹
OutputStream op = new FileOutputStream("io"+File.separator+"a.txt");
ObjectOutputStream ops = new ObjectOutputStream(op);
ops.writeObject(new Person("vae",1));
ops.close();
InputStream in = new FileInputStream("io"+File.separator+"a.txt");
ObjectInputStream os = new ObjectInputStream(in);
byte[] buffer = new byte[10];
int len = -1;
Person p = (Person) os.readObject();
System.out.println(p); //Person [name=vae, age=1]
os.close();