序列化是把對象轉(zhuǎn)換成存儲或傳輸格式的過程。
反序列化就是從文件或輸入流獲取對象。
Serializable接口
JAVA中只有實現(xiàn)了Serializable接口的類才可以實例化晕拆。
這個接口沒有方法和字段,只是起標(biāo)識作用。
transient關(guān)鍵字
transient關(guān)鍵字表示該字段是短暫的柬批,不需要序列化啸澡,比如密碼字段,敏感信息字段氮帐。
writeObject不會將此字段的值寫出嗅虏。
只有在類實現(xiàn)了Serializable接口才有意義。
讀寫
通過ObjectOutputStream
和ObjectInPutStream
寫實例
FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject("Today");
oos.writeObject(new Date());
oos.close();
讀實例
與上面寫相對應(yīng)
FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
String today = (String) ois.readObject();
Date date = (Date) ois.readObject();
ois.close();
防止對單例模式的破壞
在單例中添加readResolve方法上沐。
class Singleton
{
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
private Object readResolve() {
return singleton;
}
}