序列化机制
- 一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和储存在对象中数据的类型
- 按序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,即对象的类型信息、对象的数据、还有对象中的数据类型可以用来在内存中新建对象
- 在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象
- 类ObjectOutputStream包含序列化一个对象的方法
public final void writeObject(Object x) throws IOException
,并将它发送到输出流 - 类ObjectInputStream包含反序列化一个对象的方法
public final Object readObject() throws IOException,ClassNotFoundException
,返回值为Object,你需要将它转换成合适的数据类型 - 一个类的对象要想序列化成功,必须实现java.io.Serialzable接口,并且该类的所有属性是可序列化的。如果有一个属性不是可序列化的,则改属性必须注明是短暂的(transient)
public class ClassName implements java.io.Serializable {
public String name;
public int age;
...
}
序列化对象
- 当序列化一个对象到文件时,按Java的标准约定给文件一个.ser扩展名
import java.io.*;
public class SerializeDemo {
public static void main(Strign[] args) {
ClassName cn = new ClassName();
cn.name = "java";
cn.age = 23;
try{
FileOutputStream fo = new FileOutputStream("/.../classname.ser");
ObjectOutputStream out = new ObjectOutputStream(fo);
out.writeObject(cn);
out.close();
fo.close();
System.out.printf("Serialized data is saved in /.../classname.ser");
}catch(IOCxception e){
e.printStackTrace();
}
}
}
反序列化对象
- /…/classname.ser存储了ClassName对象
import java.io.*;
public class DeserializeDemo {
public static void main(Strign[] args) {
ClassName cn = null;
try{
FileInputStream fi = new FileInputStream("/.../classname.ser");
ObjectInputStream in = new ObjectInputStream(fi);
cn = (ClassName) in.readObject();
in.close();
fi.close();
}catch(IOCxception e){
e.printStackTrace();
return;
}catch(ClassNotFoundException c){
System.out.println("ClassName class not found");
e.printStackTrace();
return;
}
System.out.println("Deserialized ClassName...");
System.out.println("Name:" + cn.name);
System.out.println("age:" + cn.age);
}
}
- readObject()要尝试捕获ClassNotFoundException异常
- readObject()的返回值应转化为类引用
- 对于JVM可以反序列化对象,它必须是能够找到字节码的类
- 对于短暂的某个(最多一个)属性,该值没有被发送到输出流,反序列化后变成默认值