1、什么是Java对象序列化
Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。使用ObjectInputStream和ObjectOutputStream类实现java的虚拟化。
使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。
除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java序列化API为处理对象序列化提供了一个标准机制,该API简单易用,在本文的后续章节中将会陆续讲到。
2、简单例子
将Person类的实例写入到文件,然后将文件读取到内存,获取刚才输出的对象。
package io.stream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class ObjectOutputInputStreamTest { public static void main(String[] args) { ObjectInputStream input = null; ObjectOutputStream output = null; try { File file = new File("document/object.txt"); output = new ObjectOutputStream(new FileOutputStream(file)); input = new ObjectInputStream(new FileInputStream(file)); // 将person对象写出到指定的文件 Person person = new Person(1, "zhangsan", 22); output.writeObject(person); // 从文件中读取person对象 Person p2 = (Person)input.readObject(); System.out.println(p2); } catch(Exception e) { e.printStackTrace(); } finally { if ( null != output ) { try { output.close(); output = null; } catch (IOException e) { e.printStackTrace(); } } if ( null != input ) { try { input.close(); input = null; } catch (IOException e) { e.printStackTrace(); } } } } } class Person implements Serializable { private int id; private String name; private int age; public Person(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } 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 [id=" + id + ", name=" + name + ", age=" + age + "]"; } }