1,什麼是序列化?
Java中的對象存在與JVM中,當JVM關閉後對象就不存在了。爲了複用對象,能夠將對象表示爲一個字節流序列,該字節流序列被反序列化爲Java對象時的數據和類型信息與被序列化以前一致。json
2,什麼場景須要序列化?
當前的JVM須要與外接進行交互的場景。好比,使用Redis或MQ或文件存儲等持久化Java對象的場景、WebService等跨系統共享對象等場景。工具
3,序列化方法?
一、JDK自身提供了序列化Java對象的方法xml
- 對象須要實現Serializable接口,該接口沒有任何須要重寫的方法。生成private static final long serialVersionUID。若是serialVersionUID不相同,爲了防止反序列化對虛擬機形成傷害,反序列化錯。
- 被transient關鍵字修飾的屬性是不參與序化。
- 若是對象中有 private void writeObject(ObjectOutputStream out) 或者 private void readObject(ObjectInputStream in)的話,Serializable接口會調用該方法進行序列化與反序化。
- transient關鍵字、writeObject()、readObject()都是在對象實現Serializable接口的狀況下效。
- 對象實現Externalizable接口,重寫writeExternal(ObjectOutput out) 和 readExternal(ObjectInput in)方法來更靈活的實現序列化與反序列化。
二、JSON形式的序列化
可使用Alibaba提供的FastJson或者Google的gson來將對象序列化爲json字符串進行傳輸(xml字符串也能夠)。特色是很直觀。對象
三、Google protostuff
Google出品,比較強大,推薦使用。支持序列化的ClassA和反序列化的ClassB能夠是不一樣的包路徑和類名,支持先後相同屬性名的類型能夠不一樣(好比int轉long)。參見 http://www.protostuff.io/
特色是靈活、跨語言、效率高。接口
四、其餘工具,如 Kryo、Hessian等。字符串
注意:get
- Serializable接口反序列化時類的全路徑必須相同。
- 父類實現了Serializable接口,子類能夠不實現,但建議子類要擁有本身的serialVersionUID。
- 當一個對象的實例變量引用了其餘對象,被引用的對象也會序列化。
- 反序列化不會改變當前JVM類的靜態變量的值。
參考資料:虛擬機
- 以上內容爲筆者平常瑣屑積累,已無從考究引用。若是有,請站內信提示。