天天看点

java中对象的串行化(Serialization)

一、 串行化的定义

  1. 什么是串行化

  对象的寿命通常随着生成该对象的 程序 的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的 能力 ,叫做对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己,这个过程叫对象的串行化(Serialization)。

  2. 串行化的目的

  串行化的目的是为 java 的运行环境提供一组特性,其主要任务是写出对象实例变量的数值。

二、串行化方法

  在java.io包中,接口Serializable用来作为实现对象串行化的工具,只有实现了Serializable的类的对象才可以被串行化。

  1. 定义一个可串行化对象

  public class Student implements Serializable{

    int id; //学号

    String name; //姓名

    int age; //年龄

    String department //系别

    public Student(int id,String name,int age,String department){

     this.id = id;

     this.name = name;

     this.age = age;

     this.department = department;

    }

  }

  2. 构造对象的输入/输出流

  要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。

  java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能 扩展 至可读写对象。在ObjectInputStream中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。

Student stu=new Student(981036,"Liu Ming",18, "CSD");

  FileOutputStream fo=new FileOutputStream("data.ser");

  //保存对象的状态

  ObjectOutputStream so=new ObjectOutputStream(fo);

  try{

    so.writeObject(stu);

    so.close();

    }catch(IOException e )

      {System.out.println(e);}

  FileInputStream fi=new FileInputStream("data.ser");

  ObjectInputStream si=new ObjectInputStream(fi);

  //恢复对象的状态

  try{

    stu=(Student)si.readObject();

    si.close();

    }catch(IOException e )

  {System.out.println(e);}

  在这个例子中,我们首先定义一个类Student,实现了 Serializable接口,然后通过对象输出流的writeObject()方法将Student对象保存到文件data.ser中。之后,通过对象输入流的readObject()方法从文件data.ser中读出保存下来的Student对象。

三、串行化的注意事项

  1.串行化能保存的元素

  只能保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。

  2.transient关键字

 

  对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明

  3. 定制串行化

  缺省的串行化机制,对象串行化首先写入类 数据 和类字段的信息,然后按照名称的上升排列顺序写入其数值。如果想自己明确地控制这些数值的写入顺序和写入种类,必须定义自己的读取数据流的方式。就是在类的定义中重写writeObject()和readObject()方法。

  例如可在4.8.2的例子中,加入重写的writeObject()和readObject()方法,对Student 类定制其串行化。

  private void writeObject(ObjectOutputStream out)throws IOException

  {

    out.writeInt(id);

    out.writeInt(age);

    out.writeUTF(name);

    out.writeUTF(department);

  }

  private void readObject(ObjectInputStream in)throws IOException

  {

    id=in.readInt();

    age=in.readInt();

    name=in.readUTF();

    department=in.readUTF();

  }