1.什么是对象的序列化(serialize)与反序列化(deserialize)?
序列化本质上就是把对象内存的数据按照一定的规则,变成一系列的字节数据,然后再把这些字节数据写入到流中。而反序列化的过程则相反,先读取字节数据,然后再重新组装成对象。
2.对象的序列化与反序列化的作用?
利用对象的序列化与反序列化可以实现轻量级持久性(lightweight persistent)。”持久性“意味着一个对象的生存周期不取决于程序是否在运行;”轻量级“意味着我们不能让系统自动维护该过程,相反,对象必须在程序中显式序列化和反序列化还原。
对象序列化的概念加入到语言中是为了支持两种特性。一是Java的远程方法调用(Remote Method Invocation,RMI);二是为了配置程序的状态信息,如使用一个Bean时,一般是在设计阶段对它的状态信息进行配置,状态信息需要保存下来,在程序启动后进行后期恢复。
3.如何序列化和反序列化一个对象?
Java的I/O体系中主要提供了ObjectOutputStream和ObjectInputStream两个类以供开发者使用,它们的基本使用思路有以下步骤。
1)让需要序列化的类实现java.io.Serializable接口,该接口仅仅是一个标记接口,不包括任何方法。
2)提供静态的long型的常量serialVersionUID。
3)如果是序列化对象,则用一个输出流创建一个ObjectOutputStream对象,然后调用writeObject()方法。
4)如果是反序列化一个对象,首先使用一个输入流创建一个ObjectInputStream对象,然后调用readObject()方法,得到一个Object类型的对象,最后再做类型的强制转换。
5)关闭流。
看下面的例子。
//学生类,实现Serializable接口
class Student implements Serializable {
//序列化ID
private static final long serialVersionUID = 1L;
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
public class SerialTest{
public static void main(String[] args) throws IOException, ClassNotFoundException{
Student stu = new Student();
stu.setName("justright");
//创建一个对象输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/obj.dat"));
//把对象写入输出流
oos.writeObject(stu);
//关闭流
oos.close();
//创建一个对象输入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/obj.dat"));
//读出已经序列化的对象并进行强制类型转换
Student stuCopy = (Student)ois.readObject();
//关闭流
ois.close();
//打印数据
System.out.println(stuCopy.getName());
}
}
本文深入探讨了对象序列化与反序列化的概念及其作用,通过实例展示了如何在Java中实现序列化与反序列化过程,并讨论了其在持久性和状态管理中的应用。
22万+

被折叠的 条评论
为什么被折叠?



