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

原创 2015年07月06日 16:40:41

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());
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java对象反序列化防护

最近一直曝光的开源软件第三方反序列化漏洞: CVE-2015-7501Commons Collections Java反序列化漏洞 Springframework 反序列化RCE漏洞 都是由于Java...

由Java反序列化对象异常想到的

由Java反序列化对象异常想到的serialVersionUID问题。
  • baosxie
  • baosxie
  • 2017年03月14日 23:06
  • 1261

java反序列化利用

  • 2017年08月31日 23:54
  • 33.79MB
  • 下载

java反序列化利用工具

  • 2016年07月06日 20:05
  • 34.27MB
  • 下载

java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例

java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例

[未找到反序列化“XXX”类型对象的构造函数。]的解决办法

出现[未找到反序列化“XXX”类型对象的构造函数。]错误一般是由于要反序列化的类或者它的父类(如:继承了Dictionary类)实现了ISerializable接口而没有序列化构造函数,这时候只要把序...
  • mirmuo
  • mirmuo
  • 2011年12月26日 11:04
  • 1196

反序列化作用

  • 2013年07月04日 07:12
  • 104KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java对象的序列化与反序列化
举报原因:
原因补充:

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