java对象持久化或者远程调用都需要将对象序列化后保存或传递,还原就需要反序列化。
对象序列化与反序列化
对象序列化时,会将对象的状态按字节保存,反序列化再解开字节封装为对象。只序列化对象的状态,因此,对象序列化不关注静态变量。
Serializable
java为对象序列化提供了一套标准的API机制。
-
类要实现序列化,必须实现java.io.Serializable接口,该接口仅为标记作用,只有标记了该接口,才可以被序列化。
-
实现接口Serializable,默认序列化机制,会序列化当前对象及引用的其他所有关联对象。
-
serialVersionUID序列化与反序列化版本需要一致,未显示声明该版本号,则序列化时默认生成。
public class SerializationTest implements Serializable {
private String name;
private String address;
public static void main(String[] args) throws Exception {
SerializationTest t1 = new SerializationTest();
t1.name = "zhang";
t1.address = "shanghai";
System.out.println(t1.name + "->" + t1.address);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d://a.txt"));
oos.writeObject(t1);
oos.close();
t1.address = "beijing";
System.out.println(t1.name + "->" + t1.address);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d://a.txt"));
SerializationTest t2 = (SerializationTest) ois.readObject();
ois.close();
System.out.println(t1.name + "->" + t1.address);
System.out.println(t2.name + "->" + t2.address);
}
}
zhang->shanghai
zhang->beijing
zhang->beijing
zhang->shanghai
ObjectOutputStream)
ObjectOutputStream内部对String、Enum、Array等默认可处理,其他对象需要实现Serializable接口
private void writeObject0(Object obj, boolean unshared)
thr