title: Serialization
date: 2018-03-26 15:18:26
tags: [JAVA,Read]
categories: other
概述
程序运行时,变量的内容之存在于内存。
比如定义一个int
int i = 65535
这里提出一个概念——“serialization”,在python中成为pickling(序列化)这一个过程实际上是把内存中的数据变成可存储的数据,一般是指将讲数据写入磁盘。
在JAVA中,如果JVM停止后,在内存中的对象必然消失,所以需要通过序列化这一过程,持久化内存中的对象——也就是保持对象。
使用JAVA对象序列化时,会把其状态保存为一组字节,在未来将这些字节组装成对象。
示例
实际上,JDK提供了一个接口java.io.Serializable,通过这个接口,一个类可以被序列化。
public class Person implements Serializable {
private String name = null;
private Integer age = null;
private Gender gender = null;
public Person() {
System.out.println("none-arg constructor");
}
public Person(String name, Integer age, Gender gender) {
System.out.println("arg constructor");
this.name = name;
this.age = age;
this.gender = gender;
}
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;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
@Override
public String toString() {
return "[" + name + ", " + age + ", " + gender + "]";
}
}
public class SimpleSerial {
public static void main(String[] args) throws Exception {
File file = new File("person.out");
ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream(file));
Person person = new Person("John", 101, Gender.MALE);
oout.writeObject(person);
oout.close();
ObjectInputStream oin = new ObjectInputStream(new FileInputStream(file));
Object newPerson = oin.readObject(); // 没有强制转换到Person类型
oin.close();
System.out.println(newPerson);
}
}
上述代码实现了序列化和反序列化的过程,输出一个对象内容到一个文件,再读取这个文件中的内容并打印。
如果不实现Serializable,则会抛出异常NotSerializableException.