-
序列化是一種用來
處理對象流
的機制。 -
所謂對象流:就是將對象的內容進行流化。可以對流化后的對象
進行讀寫操作
,也可將流化后的對象傳輸於網絡
之間。 -
序列化是為了解決在對對象流進行讀寫操作時所引發的問題。
-
序列化的實現:將需要被序列化的類實現
Serializable接口(標記接口)
,該接口沒有需要實現的方法,implements Serializable只是為了標注
該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象;接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。 -
什么時候使用序列化呢?
- 一:對象序列化可以
實現分布式對象
。
主要應用例如:RMI(即遠程調用Remote Method Invocation)
要利用對象序列化運行遠程主機上的服務,就像在本地機上運行對象時一樣。 - 二:java對象序列化不僅保留一個對象的數據,而且遞歸保存對象引用的每個對象的數據。
可以將整個對象層次寫入字節流中,可以保存在文件中或在網絡連接上傳遞。利用對象序列化可以進行對象的"深復制",即復制對象本身及引用的對象本身
。序列化一個對象可能得到整個對象序列。 - 三:序列化可以將內存中的類寫入文件或數據庫中。
比如:將某個類序列化后存為文件,下次讀取時只需將文件中的數據反序列化
就可以將原先的類還原到內存中。也可以將類序列化為流數據進行傳輸。總的來說就是將一個已經實例化的類轉成文件存儲
,下次需要實例化的時候只要反序列化即可將類實例化到內存中並保留序列化時類中的所有變量和狀態。 - 四: 對象、文件、數據,有許多不同的格式,很難統一傳輸和保存。
序列化以后就都是字節流了,無論原來是什么東西,都能變成一樣的東西
,就可以進行通用的格式傳輸或保存,傳輸結束以后,要再次使用,就進行反序列化還原,這樣對象還是對象,文件還是文件
- 一:對象序列化可以
-
因為JAVA中要將對象序列化為
流的形式
進行傳輸。
- 對象的序列化就是為了數據傳輸,在你的代碼的里是對象格式,而在傳輸的時候不可能還保持這對象的樣子。
- 當兩個進程在進行遠程通信時,彼此可以發送各種類型的數據。無論是何種類型的數據,都會以二進制序列的形式在網絡上傳送。發送方需要把這個Java對象轉換為字節序列,才能在網絡上傳送;接收方則需要把字節序列再恢復為Java對象。
- 1.概念
- 序列化:把Java對象轉換為字節序列的過程。
- 反序列化:把字節序列恢復為Java對象的過程。
- 2.用途 對象的序列化主要有兩種用途:
- 1)把對象的字節序列永久地保存到硬盤上,通常存放在一個文件中。
- 2)在網絡上傳送對象的字節序列。
- 所謂的Serializable,就是java提供的通用數據保存和讀取的接口。至於從什么地方讀出來和保存到哪里去都被隱藏在函數參數的背后了。這樣子,任何類型只要實現了Serializable接口,就可以被保存到文件中,或者作為數據流通過網絡發送到別的地方。也可以用管道來傳輸到系統的其他程序中。這樣子極大的簡化了類的設計。只要設計一個保存一個讀取功能就能解決上面說得所有問題。
- java的"對象序列化"能讓你將一個實現了Serializable接口的對象轉換成一組byte,這樣日后要用這個對象時候,你就能把這些byte數據恢復出來,並據此重新構建那個對象了。
- 工作流當中流程變量的幾種數據類型:string、integer、short、long、double、boolean、date、binary、serializable,這就是為什么要將javabean實現序列化的原因,因為你將對象設置到流程變量中必須要實現序列化,否則會在設置流程變量的時候報錯找不到該類型。
- java對象序列化機制就是把內存中的Java對象(User之類的JavaBean)轉換成二進制流。java對象序列化后可以很方便的存儲或者在網絡中傳輸。
- Java的序列化機制是通過運行時判斷類的序列化ID(serialVersionUID)來判定版本的一致性。
- 在反序列化時,java虛擬機會通過二進制流中的serialVersionUID與本地的對應的實體類進行比較,如果相同就認為是一致的,可以進行反序列化,正確獲得信息,否則拋出序列化版本不一致的異常。
所以涉及到數據傳輸或者存儲的類,嚴格意義上來說都要加上序列化ID,這也是一種良好的編程習慣
。