新聞中心
Serializable

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出懷安免費(fèi)做網(wǎng)站回饋大家。
public interface Serializable
類的可序列化性由實(shí)現(xiàn) java.io.Serializable 接口的類啟用。未實(shí)現(xiàn)此接口的類將不會(huì)對(duì)其任何狀態(tài)進(jìn)行序列化或反序列化??尚蛄谢惖乃凶宇愋捅旧矶际强尚蛄谢?。序列化接口沒(méi)有方法或字段,僅用于識(shí)別可序列化的語(yǔ)義。
為了允許序列化不可序列化類的子類型,子類型可以負(fù)責(zé)保存和恢復(fù)超類型的公共、受保護(hù)和(如果可訪問(wèn))包字段的狀態(tài)。僅當(dāng)它擴(kuò)展的類具有可訪問(wèn)的無(wú)參數(shù)構(gòu)造函數(shù)來(lái)初始化類的狀態(tài)時(shí),子類型才可以承擔(dān)此責(zé)任。如果不是這種情況,則聲明類 Serializable 是錯(cuò)誤的。將在運(yùn)行時(shí)檢測(cè)到錯(cuò)誤。
在反序列化過(guò)程中,不可序列化類的字段將使用類的公共或受保護(hù)的無(wú)參數(shù)構(gòu)造函數(shù)進(jìn)行初始化??尚蛄谢淖宇惐仨毧梢栽L問(wèn)無(wú)參數(shù)構(gòu)造函數(shù)??尚蛄谢宇惖淖侄螌牧髦谢謴?fù)。
在遍歷圖時(shí),可能會(huì)遇到不支持 Serializable 接口的對(duì)象。在這種情況下,NotSerializableException 將被拋出,并將識(shí)別不可序列化對(duì)象的類。
在序列化和反序列化過(guò)程中需要特殊處理的類必須實(shí)現(xiàn)具有這些確切簽名的特殊方法:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
writeObject 方法負(fù)責(zé)為其特定類寫入對(duì)象的狀態(tài),以便相應(yīng)的 readObject 方法可以恢復(fù)它??梢酝ㄟ^(guò)調(diào)用 out.defaultWriteObject 來(lái)調(diào)用保存 Object 字段的默認(rèn)機(jī)制。該方法不需要關(guān)注屬于其超類或子類的狀態(tài)。通過(guò)使用 writeObject 方法或使用 DataOutput 支持的原始數(shù)據(jù)類型的方法將各個(gè)字段寫入 ObjectOutputStream 來(lái)保存狀態(tài)。
readObject 方法負(fù)責(zé)從流中讀取并恢復(fù)類字段。它可以調(diào)用 in.defaultReadObject 來(lái)調(diào)用用于恢復(fù)對(duì)象的非靜態(tài)和非瞬態(tài)字段的默認(rèn)機(jī)制。 defaultReadObject 方法使用流中的信息將保存在流中的對(duì)象的字段分配給當(dāng)前對(duì)象中相應(yīng)命名的字段。這可以處理類已經(jīng)演變?yōu)樘砑有伦侄蔚那闆r。該方法不需要關(guān)注屬于其超類或子類的狀態(tài)。通過(guò)使用 writeObject 方法或使用 DataOutput 支持的原始數(shù)據(jù)類型的方法將各個(gè)字段寫入 ObjectOutputStream 來(lái)保存狀態(tài)。
如果序列化流未將給定類列為被反序列化對(duì)象的超類,readObjectNoData 方法負(fù)責(zé)為其特定類初始化對(duì)象的狀態(tài)。這可能發(fā)生在接收方使用與發(fā)送方不同版本的反序列化實(shí)例類的情況下,并且接收方的版本擴(kuò)展了發(fā)送方版本未擴(kuò)展的類。如果序列化流已被篡改,也可能發(fā)生這種情況;因此,盡管存在“敵對(duì)”或不完整的源流,但 readObjectNoData 對(duì)于正確初始化反序列化對(duì)象很有用。
在將對(duì)象寫入流時(shí)需要指定要使用的替代對(duì)象的可序列化類應(yīng)使用精確簽名實(shí)現(xiàn)此特殊方法:
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
如果該方法存在并且可以從被序列化對(duì)象的類中定義的方法訪問(wèn),則該 writeReplace 方法由序列化調(diào)用。 因此,該方法可以具有私有、受保護(hù)和包私有訪問(wèn)。 對(duì)該方法的子類訪問(wèn)遵循 java 可訪問(wèn)性規(guī)則。
當(dāng)從流中讀取實(shí)例時(shí)需要指定替換的類應(yīng)該使用精確的簽名實(shí)現(xiàn)這個(gè)特殊方法。
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
此 readResolve 方法遵循與 writeReplace 相同的調(diào)用規(guī)則和可訪問(wèn)性規(guī)則。
序列化運(yùn)行時(shí)將版本號(hào)與每個(gè)可序列化類相關(guān)聯(lián),稱為 serialVersionUID,在反序列化期間使用該版本號(hào)來(lái)驗(yàn)證序列化對(duì)象的發(fā)送者和接收者是否已為該對(duì)象加載了與序列化兼容的類。 如果接收者為對(duì)象加載了一個(gè)類,該對(duì)象的 serialVersionUID 與相應(yīng)發(fā)送者的類不同,則反序列化將導(dǎo)致 InvalidClassException。 可序列化的類可以通過(guò)聲明一個(gè)名為“serialVersionUID”的字段來(lái)顯式聲明自己的serialVersionUID,該字段必須是靜態(tài)的、最終的和long類型:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
如果可序列化類沒(méi)有顯式聲明 serialVersionUID,則序列化運(yùn)行時(shí)將根據(jù)類的各個(gè)方面為該類計(jì)算默認(rèn)的 serialVersionUID 值,如 Java(TM) 對(duì)象序列化規(guī)范中所述。但是,強(qiáng)烈建議所有可序列化的類都顯式聲明 serialVersionUID 值,因?yàn)槟J(rèn)的 serialVersionUID 計(jì)算對(duì)類細(xì)節(jié)高度敏感,這些細(xì)節(jié)可能因編譯器實(shí)現(xiàn)而異,因此可能在反序列化期間導(dǎo)致意外的 InvalidClassExceptions。因此,為了保證在不同的 java 編譯器實(shí)現(xiàn)中具有一致的 serialVersionUID 值,可序列化的類必須聲明一個(gè)顯式的 serialVersionUID 值。還強(qiáng)烈建議顯式 serialVersionUID 聲明盡可能使用 private 修飾符,因?yàn)榇祟惵暶鲀H適用于立即聲明的類——serialVersionUID 字段不能用作繼承成員。數(shù)組類不能顯式聲明 serialVersionUID,因此它們始終具有默認(rèn)計(jì)算值,但數(shù)組類無(wú)需匹配 serialVersionUID 值。
Since:
JDK1.1
當(dāng)前名稱:創(chuàng)新互聯(lián)鴻蒙OS教程:鴻蒙OSSerializable
當(dāng)前URL:http://fisionsoft.com.cn/article/ccoddsh.html


咨詢
建站咨詢
