日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java serializable 源码_Java源码分析之-Serializable接口

發布時間:2023/12/3 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java serializable 源码_Java源码分析之-Serializable接口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、基本概念

Serializable接口:

1. 實現了Serializable接口的類,可以進行序列化和反序列化;沒有實現這個接口的類的任何(state)狀態/域或者屬性值不能被序列化

2.?All subtypes of a serializable class are themselves serializable. ?所有實現了序列話接口的類的子類是可以被序列化的

3. 為了讓不能序列化的類的子類能夠被序列化,子類要能夠保存和恢復(restore)父類的public/protected和package fields;只有在父類具有無參構造函數去初始化其域的情況下,子類才能保存和恢復父類的public/protectes和package fields;如果不是這種情況,聲明一個可序列化的類是有問題的;并且在運行期即可以檢測到這個錯誤;

4.在反序列化的過程中,不能序列化的類對應的域,將會用這個類的public或者protected修飾的無參構造方法進行初始化;無參的構造方法必須是可序列化的子類有訪問權限的;可序列化子類的域將從流中恢復回來。

5.在序列化和反序列化的過程中,這些類都需要經過特殊的處理,也就是需要去實現特殊的方法:

* private void writeObject(java.io.ObjectOutputStream out)

* throws IOException

* private void readObject(java.io.ObjectInputStream in)

* throws IOException, ClassNotFoundException;

* private void readObjectNoData()

* throws ObjectStreamException;

*

5.1? WriteObject方法:

1) ?WriteObject方法用來將特定類的對象的域寫入,這樣對應的可讀對象可以將這些域恢復回來。

2)默認的存儲對象域的機制可以通過調用方法out.defaultWriteObject()來實現,這個方法不需要去將它自己和屬于父類或者子類的域相關聯起來

3)類的狀態通過調用writeObject()方法或者用數據輸出(DataOutput)所支持的針對原生(primitive)數據類型的方法來將類所擁有的域寫入到對象輸出流(ObjectOutputStream)中來保存起來

5.2 readObject方法

1)readObject方法用來讀流,并將類的域恢復回來。

2)readObject方法可以調用in.defaultReadObject方法來執行恢復類的沒有static和transient修飾的域的默認機制。這個in.defaultReadObject方法利用流中的信息來用當前對象的對應名字的域來分配存儲在流中的對象的域。這解決了類在后期增加新的域的情況。

3)類的狀態通過調用writeObject()方法或者用數據輸出(DataOutput)所支持的針對原生(primitive)數據類型的方法來將類所擁有的域寫入到對象輸出流(ObjectOutputStream)中來保存起來

5.3 readObjectNoData方法:

1)readObjectNoData方法用來在序列化的流沒有列出所給出的類(這個類是被反序列化的對象的一個父類)的情況下去初始化這個類的對象的域。這種情況出現在接受方用了一個和發送方不同版本反序列化實例的類,并且這個接收方的版本所繼承的類并沒有被發送方的版本所繼承;這種情況也可能出現在序列化的流已經被篡改;

2)因此,在有一個不利的或者不完整的流的情況下,readObjectNoData方法對于去合理的初始化反序列化對象是非常有用的

6. 在將一個對象寫入到流中的時候,需要指派一個可替代的對象去使用的可序列化類要去實現下面的方法:

* ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;

*

1)如果這個方法存在,那么這個方法應該在被序列化的時候調用

2)這個方法需要能被在類的作用域下的其他方法訪問,因此這個方法有public/protected/private訪問權限

3)子類訪問這個方法遵循java的權限訪問規則

7. 當一個類的實例從流讀出的時候,這個類需要指派一個可替代的對象,應該要去實現下面的方法:

* ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;

*

機制和writeReplace方法類似

8.序列化版本唯一標識-SerialVersionUID

1. 定義:在序列化運行時期,會將每一個可序列化類和一個版本號關聯起來,這個版本號就叫做SerialVersionUID

2. 作用:這個序列化唯一標識的作用是為了式一個可序列化的對象發送方和接收方在裝載那個對象的類時相對于序列化是匹配的

3. 當接受方裝載了一個對象的類和對應接收方裝載的類有不同的序列化唯一標識的時候就會導致InvalidClassException

4. 一個可序列化的類可以顯示聲明一個SerialVersionUID,這個序列化唯一標識需要被static/final/long修飾

* ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

*

5. 如果一個可序列化的類不顯示聲明SerialVersionUID,那么將會基于這個類的很多方法計算一個默認的SerialVersionuid值,但是強烈建議顯示聲明,為了兼容不不同的編譯器;也建議SerialVersionUID被private修飾,從而不能被繼承,因為繼承了也沒有很大意義。

6.數組不需要顯式聲明序列化版本唯一標識,對于數組類而言,需要接收方和發送方的序列化唯一標識是一致的已經被廢棄了的。

@author unascribed

* @see java.io.ObjectOutputStream

* @see java.io.ObjectInputStream

* @see java.io.ObjectOutput

* @see java.io.ObjectInput

* @see java.io.Externalizable

* @since JDK1.1

*/

public interface Serializable {

}

二、序列化和反序列化

java對象序列化是將那些實現了Serializable接口的對象轉換為一個字節序列,并能夠在以后將這個字節序列完全恢復為原來的對象(反序列化)

1. 為什么需要序列化

一般創建的對象在程序關閉(JVM關閉)的時候,創建的對象就不會繼續存在了;如果對象能夠在程序不運行的情況下仍能存在并保存信息,那將非常有用;盡管可以通過保存到數據庫或者存在文件來恢復對象;但是序列化可以將一個對象聲明是“持久性”的,并為我們處理掉細節;(持久性意味著一個對象的生存周期并不取決于程序是否還在執行,它可以生存于程序的調用之間)

2. 序列化和反序列化的作用

2.1 Java的遠程方法調用(RMI)

序列化和反序列化使得存活于其他計算機上的對象使用起來就像是存活于本地上一樣;序列化和反序列化的過程可以通過網絡進行:這意味著序列化機制能夠自動彌補不同操作系統之間的差異;在window操作系統上序列化的對象可以linux操作系統上重新準確組裝

當向遠程對象放消息時,需要通過序列化來傳輸參數和返回值

2.2 對于java Beans來說,對象的序列化也是必須的;使用一個bean時,一般情況下是在設計階段對它的狀態信息進行配置。這種狀態信息必須保存下來,并在程序啟動時進行后期恢復。這種具體工作就是由對象序列化完成的。

3. 序列化和反序列化如何實現

3.1 序列化

要序列化一個對象,首先要創建某些OutputStream對象,然后將其封裝在一個ObjectOutputStream對象內。這時,只需要調用OutputStream對象的writeObject()方法即可將對象序列化,并將其發送給OutputStream。

3.2 反序列化

要講一個序列還原為一個對象,需要將一個InputStream封裝在ObjectInputStream內,然后調用readObject();

[注]和往常一樣,我們最后獲得的是一個引用,它指向一個向上轉型的Object,所以必須向下轉型才能直接設置它們(用(ClassNname))

總結

以上是生活随笔為你收集整理的java serializable 源码_Java源码分析之-Serializable接口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。