資源描述:
《Serializable介紹》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在教育資源-天天文庫。
1、publicinterfaceSerializable類通過實現(xiàn)java.io.Serializable接口以啟用其序列化功能。未實現(xiàn)此接口的類將無法使其任何狀態(tài)序列化或反序列化。可序列化類的所有子類型本身都是可序列化的。序列化接口沒有方法或字段,僅用于標識可序列化的語義。 要允許不可序列化類的子類型序列化,可以假定該子類型負責保存和還原超類型的公用(public)、受保護的(protected)和(如果可訪問)包(package)字段的狀態(tài)。僅在子類型擴展的類有一個可訪問的無參數(shù)構造方法來初始化該類的
2、狀態(tài)時,才可以假定子類型有此責任。如果不是這種情況,則聲明一個類為可序列化類是錯誤的。該錯誤將在運行時檢測到?! ≡诜葱蛄谢^程中,將使用該類的公用或受保護的無參數(shù)構造方法初始化不可序列化類的字段??尚蛄谢淖宇惐仨毮軌蛟L問無參數(shù)的構造方法??尚蛄谢宇惖淖侄螌脑摿髦羞€原?! ‘敱闅v一個圖形時,可能會遇到不支持可序列化接口的對象。在此情況下,將拋出NotSerializableException,并將標識不可序列化對象的類?! ≡谛蛄谢头葱蛄谢^程中需要特殊處理的類必須使用下列準確簽名來實現(xiàn)特殊方法:
3、 privatevoidwriteObject(java.io.ObjectOutputStreamout) throwsIOException privatevoidreadObject(java.io.ObjectInputStreamin) throwsIOException,ClassNotFoundException; writeObject方法負責寫入特定類的對象的狀態(tài),以便相應的readObject方法可以還原它。通過調(diào)用out.defaultWriteObject可以調(diào)用保存Ob
4、ject的字段的默認機制。該方法本身不需要涉及屬于其超類或子類的狀態(tài)。狀態(tài)是通過使用writeObject方法或使用DataOutput支持的用于基本數(shù)據(jù)類型的方法將各個字段寫入ObjectOutputStream來保存的。 readObject方法負責從流中讀取并還原類字段。它可以調(diào)用in.defaultReadObject來調(diào)用默認機制,以還原對象的非靜態(tài)和非瞬態(tài)字段。defaultReadObject方法使用流中的信息來分配流中通過當前對象中相應命名字段保存的對象的字段。這用于處理類發(fā)展后需要添加
5、新字段的情形。該方法本身不需要涉及屬于其超類或子類的狀態(tài)。狀態(tài)是通過使用writeObject方法或使用DataOutput支持的用于基本數(shù)據(jù)類型的方法將各個字段寫入ObjectOutputStream來保存的?! ο髮懭肓鲿r需要指定要使用的替代對象的可序列化類,應使用準確的簽名來實現(xiàn)此特殊方法: ANY-ACCESS-MODIFIERObjectwriteReplace()throwsObjectStreamException; 此writeReplace方法將由序列化調(diào)用,前提是如果此方法存在
6、,而且它可以通過被序列化對象的類中定義的一個方法訪問。因此,該方法可以擁有私有(private)、受保護的(protected)和包私有(package-private)訪問。子類對此方法的訪問遵循java訪問規(guī)則?! ≡趶牧髦凶x取類的一個實例時需要指定替代的類應使用的準確簽名來實現(xiàn)此特殊方法?! NY-ACCESS-MODIFIERObjectreadResolve()throwsObjectStreamException; 此readResolve方法遵循與writeReplace相同的調(diào)用規(guī)則和
7、訪問規(guī)則?! ⌒蛄谢\行時使用一個稱為serialVersionUID的版本號與每個可序列化類相關聯(lián),該序列號在反序列化過程中用于驗證序列化對象的發(fā)送者和接收者是否為該對象加載了與序列化兼容的類。如果接收者加載的該對象的類的serialVersionUID與對應的發(fā)送者的類的版本號不同,則反序列化將會導致InvalidClassException??尚蛄谢惪梢酝ㄟ^聲明名為"serialVersionUID"的字段(該字段必須是靜態(tài)(static)、最終(final)的long型字段)顯式聲明其自己的se
8、rialVersionUID: ANY-ACCESS-MODIFIERstaticfinallongserialVersionUID=42L; 如果可序列化類未顯式聲明serialVersionUID,則序列化運行時將基于該類的各個方面計算該類的默認serialVersionUID值,如“Java(TM)對象序列化規(guī)范”中所述。不過,強烈建議所有可序列化類都顯式聲明serialVersionUID值,原因計算默認的seri