java.io.Serializable引起的問題——什麼是序列化?在什麼狀況下將類序列化?
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。能夠對流化後的對象進行讀寫操做,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操做時所引起的問題。序列化的實現:將須要被序列化的類實現Serializable接口,該接口沒有須要實現的方法,implements Serializable只是爲了標註該對象是可被序列化的,而後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就能夠將參數爲obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。 java
序列化:序列化是將對象轉換爲容易傳輸的格式的過程。例如,能夠序列化一個對象,而後使用 HTTP 經過 Internet 在客戶端和服務器之間傳輸該對象。在另外一端,反序列化將從該流從新構造對象。
是對象永久化的一種機制。 程序員
確切的說應該是對象的序列化,通常程序在運行時,產生對象,這些對象隨着程序的中止運行而消失,但若是咱們想把某些對象(由於是對象,因此有各自不一樣的特性)保存下來,在程序終止運行後,這些對象仍然存在,能夠在程序再次運行時讀取這些對象的值,或者在其餘程序中利用這些保存下來的對象。這種狀況下就要用到對象的序列化。 服務器
只有序列化的對象才能夠存儲在存儲設備上。爲了對象的序列化而須要繼承的接口也只是一個象徵性的接口而已,也就是說繼承這個接口說明這個對象能夠被序列化了,沒有其餘的目的。之因此須要對象序列化,是由於有時候對象須要在網絡上傳輸,傳輸的時候須要這種序列化處理,從服務器硬盤上把序列化的對象取出,而後經過網絡傳到客戶端,再由客戶端把序列化的對象讀入內存,執行相應的處理。 網絡
對象序列化是java的一個特徵,經過該特徵能夠將對象寫做一組字節碼,當在其餘位置讀到這些字節碼時,能夠依此建立一個新的對象,並且新對象的狀態與原對象徹底相同。爲了實現對象序列化,要求必須可以訪問類的私有變量,從而保證對象狀態可以正確的得以保存和恢復。相應的,對象序列化API可以在對象重建時,將這些值還原給私有的數據成員。這是對java語言訪問權限的挑戰。一般用在服務器客戶端的對象交換上面,另外就是在本機的存儲。 性能
對象序列化的最主要的用處就是在傳遞,和保存對象(object)的時候,保證對象的完整性和可傳遞性。譬如經過網絡傳輸,或者把一個對象保存成一個文件的時候,要實現序列化接口 。
*
Quote: code
比較java.io.Externalizable和java.io.Serializable
[URL]http://www.zdnet.com.cn/developer/code/story/0,3800066897,39304080,00.htm[/URL] htm
即便你沒有用過對象序列化(serialization),你可能也知道它。但你是否知道 Java 還支持另一種形式的對象持久化,外部化(externalization)? 對象
下面是序列化和外部化在代碼級的關聯方式: 繼承
public interface Serializable {} 接口
public interface Externalizable extends Serializable {
void readExternal(ObjectInput in);
void writeExternal(ObjectOutput out);
}
序列化和外部化的主要區別
外部化和序列化是實現同一目標的兩種不一樣方法。下面讓咱們分析一下序列化和外部化之間的主要區別。
經過Serializable接口對對象序列化的支持是內建於核心 API 的,可是java.io.Externalizable的全部實現者必須提供讀取和寫出的實現。Java 已經具備了對序列化的內建支持,也就是說只要製做本身的類java.io.Serializable,Java 就會試圖存儲和重組你的對象。若是使用外部化,你就能夠選擇徹底由本身完成讀取和寫出的工做,Java 對外部化所提供的惟一支持是接口:
voidreadExternal(ObjectInput in)
void writeExternal(ObjectOutput out)
如今如何實現readExternal() 和writeExternal() 就徹底看你本身了。
序列化會自動存儲必要的信息,用以反序列化被存儲的實例,而外部化則只保存被存儲的類的標識。當你經過java.io.Serializable接口序列化一個對象時,有關類的信息,好比它的屬性和這些屬性的類型,都與實例數據一塊兒被存儲起來。在選擇走Externalizable這條路時,Java 只存儲有關每一個被存儲類型的很是少的信息。
每一個接口的優勢和缺點
Serializable接口
· 優勢:內建支持
· 優勢:易於實現
· 缺點:佔用空間過大
· 缺點:因爲額外的開銷致使速度變比較慢
Externalizable接口
· 優勢:開銷較少(程序員決定存儲什麼)
· 優勢:可能的速度提高
· 缺點:虛擬機不提供任何幫助,也就是說全部的工做都落到了開發人員的肩上。
在二者之間如何選擇要根據應用程序的需求來定。Serializable一般是最簡單的解決方案,可是它可能會致使出現不可接受的性能問題或空間問題;在出現這些問題的狀況下,Externalizable多是一條可行之路。
要記住一點,若是一個類是可外部化的(Externalizable),那麼Externalizable方法將被用於序列化類的實例,即便這個類型提供了Serializable方法:
private void writeObject() private void readObject()