閱讀122 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java序列化和反序列化

  • 序列化:Java對象轉換為字節序列
  • 反序列化:字節序列轉換為Java對象

實現了Serializable或Externalnalizable接口的接口或類,通過ObjectInputStream或ObjectOutputStream可以進行二進製文件與Java對象之間的轉換。

Serializable

  • 實現了Serializable的對象,可以將該對象的非transient的實例變量進行序列化或反序列化。
  • 若重寫了 readObject(ObjectInputStream in)writeObject(ObjectOutputSteam out) 方法,則會調用這兩個方法進行序列化或反序列化。

PS:non-transient字段不會參與序列化會反序列化,這樣,有時傳輸數據對象可以節省不必要的時空開銷。


普通序列化

MyObject obj = new MyObject("zou", "male");

// 序列化
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/user/zoujs/documents/java.obj"));
out.writeObject(obj);
out.close();

// 反序列化
ObjectInputStream in = new ObjectInputStream(new FileOutputStream("/user/zoujs/documents/java.obj"));
MyObject object = (MyObject)in.readObject();
in.close();

結合從前寫的Closeable的文章,可以將代碼寫成如下形式。

// 序列化
MyObject obj = new MyObject("zou", "male");
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/users/zoujs/documents/java.obj"))){
    out.writeObject(obj);
}

// 反序列化
MyObject object;
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("/user/zoujs/documents/java.obj"))){
    object = (MyObject)in.readObject();
}

readObject()writeObject() 方法的序列化和反序列化

這兩個方法可以在序列化和反序列化時定製用戶的行為,即使它們被生命為private,但這絲毫不影響它們的作用。
實際上,ObjectInputStream和ObjectOutputStream通過反射來尋找對象是否實現了這兩個方法,


最後更新:2017-08-21 20:02:16

  上一篇:go  記一次阿裏雲ECS實例預約遷移
  下一篇:go  Closeable