今日研究了下对象串行化,所以将学习体会写成博客,供大家参考,欢迎指正!
****本文参考《Java技术及其应用》******************
******在此表示感谢!****************************
请路过者留下的你的文字
一、串行化概念及目的
概念:
对象寿命通常伴随着生成该对象程序终止而终止。有时候就可能需要将对象状态保存下来,在需要的时候将其恢复。
对象记录自身的状态以便将来再生的能力叫做对象的持续性。对象通过写出自身的状态的数字来记录自己,这个过
程为对象的串行化。
理所当然串行化的主要任务:写出对象实例变量的数 值。如果对象是另一个对象的引用,则引用对象也要串行化。
这个过程是递归的。
目的:
1. 尽量保持对象串行化简洁。
2.串行化机制要严格助手java对象模型,对象串行化状态中应该报讯所有关于类的安全信息;
3.对象串行化机制应支持Java对象的持续性。
4.对象串行化机制应该有足够可扩展能力已支持对象的远程方法调用(Remote Method Invocation,RMI)。
5.对象串行化应运行对象定义自身的格式,即其自身的数据流表示形式,可能接口外部化完成这项功能。
二、串行化方法
自JDK1.1版本开始,Java语言提供了对象串行化机制,在java.io包中,接口Serializable被用来作为实现对象串行化的工具,
Serializable中没有任何方法,声明实现一个Serializable接口时,仅仅表明该类参加串行化协议,无需实现任何方法。
三.串行化实现例子:
1.定义一个可串行化的对象,实现Serializable接口。
import java.io.Serializable;
public class Student implements Serializable { // 实现 Serializable接口
public int id;
public int age;
public String name;
public 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 和ObjecOutputStream将数据流功能扩展到可读/科协对象,在ObjectInputStream中用
readObject()方法直接读取一个对象,在ObjectOutputStream中用writeObject()发发直接将对象保存到输出流中;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectSer {
public static void main(String[] args) throws IOException,
ClassNotFoundException {
String filepath = "./objdata.ser";
Student stu = new Student(1000, "Jack", 20, "PSD");
int i;
FileOutputStream fos = new FileOutputStream(filepath);
ObjectOutputStream oos = new ObjectOutputStream(fos);
try {
oos.writeObject(stu); // 通读对象输出流将将对象状态保存下来
oos.close();
} catch (IOException e) {
System.out.println("E1: " + e);
}
stu = null;
FileInputStream fis = new FileInputStream(filepath);
ObjectInputStream ois = new ObjectInputStream(fis);
try {
stu = (Student) ois.readObject();// 再通过对象输出流将对象恢复
ois.close();
} catch (IOException e) {
System.out.println("E2: " + e);
}
System.out.println("Student info: ");
System.out.println("ID:" + stu.id);
System.out.println("Name:" + stu.name);
System.out.println("Age:" + stu.age);
System.out.println("Department:" + stu.department);
}
}
本人JDK1.6,eclipse3.4上运行结果:
Student info:
ID:1000
Name:Jack
Age:20
Department:PSD
例子先定义一个Student类,实现Serializable接口,然后通过对象输出流writeObject()方法将stu对象保存到objdata.ser;
然后通过输入流readObject()方法从问及爱你中读取保存的Student对象。由此,通过串行化机制,可以正确地保存和恢复对象状态
串行化注意事项:
1.串行化只能保存非静态成员变量,不能保存任何成员方法和静态成员变量,而且串行化所保存的只
是 变量的值,对于任何修饰都不能保存。
2.某些类型的对象,如关键字transient关键字修饰对象为瞬时的,这样的对象无法保持其状态,例如
Thread对象,或一个FileInputStream对象,对其必须用transient关键字表明,否则编译器将报
错。
3.串行化涉及到将对象存放到磁盘或者在网络上发送数据,这时候就会产生安全性问题,因为数据位于
Java运行环境之外,而不在Java安全机制掌握之中,对于这些需要保密字段,不应该保存在永久存
放介质中,或者不应该简单的不家处理地保存下来。为了保证安全,应该在这些字段前面加上关键
字transient.