对象的串行化(Serialization)

转载 2007年10月14日 21:26:00

  对象的串行化(Serialization)
1. 什么是串行化

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

  串行化的目的是为java的运行环境提供一组特性,其主要任务是写出对象实例变量的数值。
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();
  }

Java中对象的串行化(Serialization)和transient关键字

Java中对象的串行化(Serialization)和transient关键字前言:该篇文章参考自网上资料,但是部分内容经过笔者更改,因此算作原创吧,原文地址:http://www.goldenbg....
  • hbcui1984
  • hbcui1984
  • 2007-04-02 14:01:00
  • 9713

Qt串行化的输入和输出

参考https://lug.ustc.edu.cn/sites/qtguide/ 串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内存缓冲区等)中或是以二...
  • guoqianqian5812
  • guoqianqian5812
  • 2016-03-05 18:55:42
  • 1149

[VC++(MFC)]串行化(Serialization)

串行化(Serialization)作者:阿荣 下载例子源代码串行化是微软提供的用于对对象进行文件I/O的...
  • c0ffee1982
  • c0ffee1982
  • 2007-11-19 12:09:00
  • 1000

二叉树的串行化 Serialization of Binary Tree

二叉树的串行化 Serialization of Binary Tree 转自:http://www.geeksforgeeks.org/serialize-deserialize-binary-t...
  • jiyanfeng1
  • jiyanfeng1
  • 2014-11-28 07:21:09
  • 1699

对象的串行化(Serialization)

对象的串行化(Serialization) 串行化的定义 1. 什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这...
  • heavenying
  • heavenying
  • 2007-05-12 18:28:00
  • 630

Java Serialization机制和transient

对象的串行化(Serialization)   一、串行化的概念和目的 1.什么是串行化              对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将...
  • runningtortoises
  • runningtortoises
  • 2014-11-17 21:44:13
  • 672

Java对象的串行化(Serialization)

概念串行化的简单介绍对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力叫作对象的持续性(pe...
  • jlqCloud
  • jlqCloud
  • 2015-05-09 16:14:03
  • 466

对象的串行化(Serialization)

一、串行化的概念和目的  1.什么是串行化              对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这...
  • caiwenfeng_for_23
  • caiwenfeng_for_23
  • 2013-10-18 11:42:49
  • 2650

对象的串行化(Serialization)和transient

 一、串行化的概念和目的 1.什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便 将来再生的...
  • wuyu0314
  • wuyu0314
  • 2009-08-14 23:26:00
  • 206

java 对象的串行化(Serialization)

transient Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中 class A impleme...
  • superkris
  • superkris
  • 2012-08-14 11:18:08
  • 757
收藏助手
不良信息举报
您举报文章: 对象的串行化(Serialization)
举报原因:
原因补充:

(最多只允许输入30个字)