序列化Serializable
作用
1.當2個進程在進行遠程通信時,相互發送數據,數據都是以二進制的形式傳送的。如果我們要傳輸對象的話,就需要把對象轉化爲字節數組(二進制數據),接收方接收後反序列成對象。目的在於,傳送對象的狀態,也就是屬性值
2.反序列化後的對象還可以保存到硬盤上。
實現方式
1.實現Serializable
接口。
2.實現Serializable
接口,並增加void writeObject(ObjectOutputStream out) throws IOException
與void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
這2個方法來自定義某些屬性的序列化。
3.實現Externalizable
接口(該接口繼承自Serializable
接口),並重寫writeExtername
與readExternal
方法來完全自定義要序列化的屬性。
顯式定義serialVersionUID
屬性的作用
1.對於一個要進行序列化的類,我們希望類的不同版本對序列化兼容(這個類可能前前後後對字段進行刪改),如果不顯式設置id,這個類的每個版本的id(由系統生成)都是不一樣的。那麼反序列化的時候,永遠只能反序列化最新的實例了(舊的實例因爲id不一致將失敗)。
2.所以要保證兼容的話,就需要設置一個顯式的id。那麼在序列化舊的實例時,新添加的或更改的字段會被設置爲null,刪除的字段不設置。
3.如果我們不想兼容不同版本,我們還可以爲不同的版本再設置一個版本號。在序列化和反序列化的過程中(自定義序列化),我們還可以根據版本號來選擇性的序列化那些變化的屬性的狀態。
在springmvc裏,javabean都要實現Serializable
接口,並生成顯式id
其目的就是我們上面分析的序列化的作用以及顯式id的作用,特別是在遠程服務調用的項目中。