对象序列化的需求最早是为了能够在网络上传输对象,传统的各种类型的数据都是以二进制序列的形式在网上传送的。如果想在网络上发送Java对象,就需要把这个Java对象转换为字节序列,才能在网络上传送,然后接收方在接到数据后再将字节序列恢复为Java对象即可。
  1. ObjectOutputStream和ObjectInputStream类
java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream代表对象输入流,它的readObject( )方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
  1. Serializable和Externalizable接口
只有实现了Seriazable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式。
序列化主要是用于两方面:
  1. RMI,远程传递对象
  2. JavaBean,Bean的状态信息通常是在设计时配置的。这些状态信息必须保存起来,供程序启动的时候用。
Java中实现序列化,只要implements接口即可。

具体步骤如下:
  • 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
  • 通过对象输出流的writeObject( )方法写对象。
//MakeObjectFile.java
package com.company;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

/**
* Created by jiajie on 2017/2/16.
*/
public class MakeObjectFile implements java.io.Serializable {
    private String str = new String();

    public void setStr(String str) {
        this.str = str;
    }

    public String getStr() {
        return str;
    }

    public static void main(String args[]) {
        try {
            FileOutputStream objfile = new FileOutputStream("makeobj.obj");
            ObjectOutputStream p = new ObjectOutputStream(objfile);
            MakeObjectFile mof = new MakeObjectFile();
            mof.setStr("abcd");
            p.writeObject(mof);
            p.flush();
            objfile.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
运行之后,在目录中出现了一个新的文件makeobj.obj,这个文件中就存放着这个对象的序列字节。
反序列化差不多,步骤如下:
  • 创建一个对象输入流,它可以包装一个其他类型的元输入流,如文件输入流;
  • 通过对象输入流的readObject( )方法读取对象。
//OpenObjectFile.java
package com.company;

import java.io.FileInputStream;
import java.io.ObjectInputStream;

/**
* Created by jiajie on 2017/2/16.
*/
public class OpenObjectFile {
    public static void main(String args[]) {
        try {
            FileInputStream objfile = new FileInputStream("makeobj.obj");
            ObjectInputStream q = new ObjectInputStream(objfile);

            MakeObjectFile mof = (MakeObjectFile)q.readObject();
            System.out.println(mof.getStr());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }