关闭

Java对象的序列化与反序列化

标签: 序列化java持久性数据
204人阅读 评论(0) 收藏 举报
分类:

1.什么是对象的序列化(serialize)与反序列化(deserialize)?

序列化本质上就是把对象内存的数据按照一定的规则,变成一系列的字节数据,然后再把这些字节数据写入到流中。而反序列化的过程则相反,先读取字节数据,然后再重新组装成对象。

2.对象的序列化与反序列化的作用?

利用对象的序列化与反序列化可以实现轻量级持久性(lightweight persistent)。”持久性“意味着一个对象的生存周期不取决于程序是否在运行;”轻量级“意味着我们不能让系统自动维护该过程,相反,对象必须在程序中显式序列化和反序列化还原。

对象序列化的概念加入到语言中是为了支持两种特性。一是Java的远程方法调用(Remote Method Invocation,RMI);二是为了配置程序的状态信息,如使用一个Bean时,一般是在设计阶段对它的状态信息进行配置,状态信息需要保存下来,在程序启动后进行后期恢复。

3.如何序列化和反序列化一个对象?

Java的I/O体系中主要提供了ObjectOutputStreamObjectInputStream两个类以供开发者使用,它们的基本使用思路有以下步骤。
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());
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    文章分类
    文章存档
    最新评论