Java中的序列化与反序列化
Java中的序列化与反序列化
序列化和反序列化是通过ObjectInputStream和ObjectOutputStream的readObject()和writeObject()实现的,序列化的过程是一个对象流状态保存的过程,这里什么叫对象流,可以理解为一系列的对象,因为本身一个对象的内部的字段都是一个个对象,实际上是通过“级联”的方式,保存跟此对象所有关联的对象的状态,实际上保存了跟此对象有关系的一张“对象网”。
反序列化是还原对象状态的过程,这种还原的过程可能在同一个应用中,可能在不同的应用中,可能在不同的主机上,还原的过程不是读出原来对象的字段值然后调用构造函数重新new一个对象,而是“直接地”反序列化为一个Object对象,并没有调用该类的构造函数,jvm也没有加载该类到方法区,还原后的对象若在不同的主机,想通过反射获得更多改对象的描述信息,必须保证JVM能在本地类路径或者因特网的其他什么地方找到相关的.class文件。
序列化也可以自己控制,使用Externalizable接口,此接口继承自Serializable接口,和Serializable不同的是,使用Externalizable接口,在恢复对象的时候是调用的该类的无参构造方法,若无参构造方法不是public的,在恢复对象的时候会抛出异常,下面的代码节选自Think in java
- package externalizable;
- import java.io.Externalizable;
- import java.io.IOException;
- import java.io.ObjectInput;
- import java.io.ObjectOutput;
- public class Blip1 implements Externalizable {
- //public的构造方法,在回复对象的时候被调用。
- public Blip1() {
- System.out.println("Blip1 Constructor");
- }
- //在writeObject()方法的时候,会调用此方法
- public void writeExternal(ObjectOutput out) throws IOException {
- System.out.println("Blip1.writeExternal");
- }
- //在readObject()方法的时候,会调用此方法
- public void readExternal(ObjectInput in) throws IOException,
- ClassNotFoundException {
- System.out.println("Blip1.readExternal");
- }
- }
- package externalizable;
- import java.io.Externalizable;
- import java.io.IOException;
- import java.io.ObjectInput;
- import java.io.ObjectOutput;
- public class Blip2 implements Externalizable {
- //此构造方法不是public的
- Blip2() {
- System.out.println("Blip2 Constructor");
- }
- public void writeExternal(ObjectOutput out) throws IOException {
- System.out.println("Blip2.writeExternal");
- }
- public void readExternal(ObjectInput in) throws IOException,
- ClassNotFoundException {
- System.out.println("Blip2.readExternal");
- }
- }
- package externalizable;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- public class Blips {
- public static void main(String[] args) {
- System.out.println("Constructing objects:");
- Blip1 b1 = new Blip1();
- Blip2 b2 = new Blip2();
- try {
- ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(
- "Blips.out"));
- System.out.println("Saving objects:");
- o.writeObject(b1);
- o.writeObject(b2);
- o.close();
- // Now get them back:
- ObjectInputStream in = new ObjectInputStream(new FileInputStream(
- "Blips.out"));
- System.out.println("Recovering b1:");
- b1 = (Blip1) in.readObject();
- // OOPS! Throws an exception:
- // !System.out.println("Recovering b2:");
- // !b2 = (Blip2) in.readObject();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
输入的结果为:
Constructing objects:
Blip1 Constructor
Blip2 Constructor
Saving objects:
Blip1.writeExternal
Blip2.writeExternal
Recovering b1:
Blip1 Constructor
Blip1.readExternal
|
评论暂时关闭