一Definition
序列化:
即是 将 对象的变量信息 转换为字节流 保存起来,并在以后能还原这个对象的信息(反序列化)。 。通俗来讲,就是将对象的信息从内存保存到磁盘上。
二Notice
注意:
a)对象的 方法函数不能序列化
b)对象的static静态变量不能序列化(因为静态变量是类的,不是对象的)
c)标示为transient关键字的变量不能序列化。
只有实现了Serializable接口的类的对象才能被序列化!Only objects that support the java.io.Serializable interface can be written to streams.
三KeyPoint
序列化使用到类 ObjectOutputStream (An ObjectOutputStream writes primitive data types and graphs of Java objects to an OutputStream)
序列化的实现:将需要被序列化的类实现Serializable接口,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object
obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
四ExampleCase
package com.javaIO.Serialization;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializeTest {
public static void main(String[] args) throws Exception {
//将Person类的3个对象序列化
Person p1 = new Person(45, "zhang", 1.87);
Person p2 = new Person(87, "lisi", 1.34);
Person p3 = new Person(49, "wangwu", 1.78);
//写到文件流中
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
"Seria.txt"));
oos.writeObject(p1);// 写对象
oos.writeObject(p2);
oos.writeObject(p3);
oos.close();
//------------------------Anti-Serialization----------------------------
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
"Seria.txt"));
Person p4=(Person)ois.readObject();
Person p5=(Person)ois.readObject();
Person p6=(Person)ois.readObject();
System.out.println(p4.getLength()+" "+p4.getName()+" "+p4.getNumber());
System.out.println(p5.getLength()+" "+p5.getName()+" "+p5.getNumber());
System.out.println(p6.getLength()+" "+p6.getName()+" "+p6.getNumber());
ois.close();
}
}
class Person implements Serializable {
int number;
String name;
transient double length; //把length变量标示为transient,则该变量不会被序列化。
//函数方法不会被序列化。序列化是指保存对象的状态,以便以后的恢复
public int getNumber() {
return number;
}
public String getName() {
return name;
}
public double getLength() {
return length;
}
public Person(int num, String na, double len) {
this.number = num;
this.name = na;
this.length = len;
}
}
输出:
0.0 zhang 45
0.0 lisi 87
0.0 wangwu 49
显然 length变量没有被序列化。