一、简介
- 概念:
- 序列化:把对象转换为字节序列的过程称为对象的序列化。
- 反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
- 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象,这个相反的过程又称为反序列化。
二、什么时候需要序列化?
- a. 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
- b. 当你想用套接字在网络上传送对象的时候;
- c. 当你想通过RMI传输对象的时候;(远程方法调用)
三、如何实现序列化?
要想实现序列化,只需要实现Serializable接口即可。
示例:
【a】创建需要序列化的类
public class FlyPig implements Serializable {
private static final long serialVersionUID = -6224548838756292505L;
private static String AGE = "269";
private String name;
private String color;
transient private String car;
//private String addTip;
public static long getSerialVersionUID() {
return serialVersionUID;
}
public static String getAGE() {
return AGE;
}
public static void setAGE(String AGE) {
FlyPig.AGE = AGE;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getCar() {
return car;
}
public void setCar(String car) {
this.car = car;
}
@Override
public String toString() {
return "FlyPig{" +
"name='" + name + '\'' +
", color='" + color + '\'' +
", car='" + car + '\'' +
'}';
}
}
【b】创建序列化的工具类
class SerializableUtils {
/**
* 序列化
*
* @throws IOException
*/
static void seriablizablePig() throws IOException {
FlyPig flyPig = new FlyPig();
flyPig.setColor("black");
flyPig.setName("naruto");
flyPig.setCar("0000");
// ObjectOutputStream 对象输出流,将 flyPig 对象存储到F盘的 flypig.txt 文件中,完成对 flyPig 对象的序列化操作
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("f:/flypig.txt")));
oos.writeObject(flyPig);
System.out.println("对象序列化成功");
oos.close();
}
/**
* 反序列化
*
* @throws IOException
* @throws ClassNotFoundException
*/
static void deserializeFlyPig() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("f:/flypig.txt")));
FlyPig flyPig = (FlyPig) ois.readObject();
System.out.println(flyPig);
System.out.println("对象反序列化成功");
ois.close();
}
}
【c】 测试
public class SerializableTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
SerializableUtils.seriablizablePig();
//FlyPig{name='naruto', color='black', car='null'}
//使用transient的字段不会序列化到文件中
SerializableUtils.deserializeFlyPig();
}
}
四、总结
- a. ObjectOutputStream代表对象输出流:它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中;
- b. ObjectInputStream代表对象输入流:它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回;
- c. transient 修饰的属性,是不会被序列化的;
- d. 静态static的属性,是不会被序列化的;