java 序列化實現物件的深拷貝
阿新 • • 發佈:2019-01-22
寫java程式碼時,經常要實現物件的clone方法,處理物件的深拷貝問題。有一種簡單的實現物件深拷貝的方法:將物件寫入到位元組流中,再讀出來即可實現深拷貝。
@SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T obj) { T cloneObj = null; ObjectOutputStream oos = null; ObjectInputStream ois = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(obj); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ois = new ObjectInputStream(bais); cloneObj = (T) ois.readObject(); } catch (Exception e) { e.printStackTrace(); } finally { if (oos != null) { try { oos.close(); } catch (Exception e) { e.printStackTrace(); } } if (ois != null) { try { ois.close(); } catch (Exception e) { e.printStackTrace(); } } } return cloneObj; }
執行此方法需要注意:
- 物件需要實現Serializable介面
- 物件內部的屬性均可序列化
- 注意方法和屬性的特殊修飾符。比如final、static變數的序列化問題會被引入到物件拷貝中。transient變數不會序列化。