对象序列化
分类:Java
对象序列化的需求最早是为了能够在网络上传输对象,传统的各种类型的数据都是以二进制序列的形式在网上传送的。如果想在网络上发送Java对象,就需要把这个Java对象转换为字节序列,才能在网络上传送,然后接收方在接到数据后再将字节序列恢复为Java对象即可。
- ObjectOutputStream和ObjectInputStream类
java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream代表对象输入流,它的readObject( )方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
- Serializable和Externalizable接口
只有实现了Seriazable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式。
序列化主要是用于两方面:
- RMI,远程传递对象
- 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();
}
}
}
如果有收获,可以请我喝杯咖啡!