国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
什么是writeObject 和readObject?可定制的序列化過程
userphoto

2010.11.27

關注
這篇文章很直接,簡單易懂。嘗試著翻譯一下 ,原文是What are writeObject and readObject? Customizing the serialization process.
在Java中使用Serialization相當簡單。如果你有一些對象想要進行序列化,你只需實現(xiàn)Serializable接口。然后,你可以使用ObjectOutputStream將該對象保存至文件或發(fā)送到其他主機。所有的non-transient和non-static字段都將被序列化,并且由反序列化重構造出一模一樣的對象聯(lián)系圖(譬如許多引用都指向該對象)。但有時你可能想實現(xiàn)你自己的對象序列化和反序列化。那么你可以在某些特定情形下得到更多的控制。來看下面的簡單例子。
Java代碼 
class SessionDTO implements Serializable {
private static final long serialVersionUID = 1L;
private int data; // Stores session data
// Session activation time (creation, deserialization)
private long activationTime;
public SessionDTO(int data) {
this.data = data;
this.activationTime = System.currentTimeMillis();
}
public int getData() {
return data;
}
public long getActivationTime() {
return activationTime;
}
}
以下是序列化上述class到文件和其反序列化的主函數(shù)。
Java代碼 
public class SerializeTester implements Serializable {
public static void main(String... strings) throws Exception {
File file = new File("out.ser");
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(file));
SessionDTO dto = new SessionDTO(1);
oos.writeObject(dto);
oos.close();
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(file));
SessionDTO dto = (SessionDTO) ois.readObject();
System.out.println("data : " + dto.getData()
+ " activation time : " + dto.getActivationTime());
ois.close();
}
}
類SessionDTO展現(xiàn)的是要在兩個服務器之間傳輸?shù)膕ession。它包含了一些信息在字段data上,該字段需要被序列化。但是它還有另外一個字段activationTime,該字段應該是session對象第一次出現(xiàn)在任意服務器上的時間。它不在我們想要傳輸?shù)男畔⒅?。這個字段應該在反序列化之后在賦值。進一步來說,沒必要把它放在stream中在服務器中傳遞,因為它占據(jù)了不必要的空間。
解決這種情況可以使用writeObject和readObject。有可能你們有一些人沒有聽說過它們,那是因為它們在許多Java書籍中給忽略了,而且它們們也不是眾多流行Java考試的一部分。讓我們用這些方法來重寫SessionDTO:
Java代碼 
class SessionDTO implements Serializable {
private static final long serialVersionUID = 1L;
private transient int data; // Stores session data
//Session activation time (creation, deserialization)
private transient long activationTime;
public SessionDTO(int data) {
this.data = data;
this.activationTime = System.currentTimeMillis();
}
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
oos.writeInt(data);
System.out.println("session serialized");
}
private void readObject(ObjectInputStream ois) throws IOException,
ClassNotFoundException {
ois.defaultReadObject();
data = ois.readInt();
activationTime = System.currentTimeMillis();
System.out.println("session deserialized");
}
public int getData() {
return data;
}
public long getActivationTime() {
return activationTime;
}
}
方法writeObject處理對象的序列化。如果聲明該方法,它將會被ObjectOutputStream調(diào)用而不是默認的序列化進程。如果你是第一次看見它,你會很驚奇盡管它們被外部類調(diào)用但事實上這是兩個private的方法。并且它們既不存在于java.lang.Object,也沒有在Serializable中聲明。那么ObjectOutputStream如何使用它們的呢?這個嗎,ObjectOutputStream使用了反射來尋找是否聲明了這兩個方法。因為ObjectOutputStream使用getPrivateMethod,所以這些方法不得不被聲明為priate以至于供ObjectOutputStream來使用。
在兩個方法的開始處,你會發(fā)現(xiàn)調(diào)用了defaultWriteObject()和defaultReadObject()。它們做的是默認的序列化進程,就像寫/讀所有的non-transient和 non-static字段(但他們不會去做serialVersionUID的檢查).通常說來,所有我們想要自己處理的字段都應該聲明為transient。這樣的話,defaultWriteObject/defaultReadObject便可以專注于其余字段,而我們則可為這些特定的字段(譯者:指transient)定制序列化。使用那兩個默認的方法并不是強制的,而是給予了處理復雜應用時更多的靈活性。
你可以從這里這里讀到更多有關于序列化的知識。
自己再補充一些:
1.Write的順序和read的順序需要對應,譬如有多個字段都用wirteInt一一寫入流中,那么readInt需要按照順序?qū)⑵滟x值;
2.Externalizable,該接口是繼承于Serializable ,所以實現(xiàn)序列化有兩種方式。區(qū)別在于Externalizable多聲明了兩個方法readExternal和writeExternal,子類必須實現(xiàn)二者。Serializable是內(nèi)建支持的也就是直接implement即可,但Externalizable的實現(xiàn)類必須提供readExternal和writeExternal實現(xiàn)。對于Serializable來說,Java自己建立對象圖和字段進行對象序列化,可能會占用更多空間。而Externalizable則完全需要程序員自己控制如何寫/讀,麻煩但可以有效控制序列化的存儲的內(nèi)容。
3.正如Effectvie Java中提到的,序列化就如同另外一個構造函數(shù),只不過是有由stream進行創(chuàng)建的。如果字段有一些條件限制的,特別是非可變的類定義了可變的字段會反序列化可能會有問題??梢栽趓eadObject方法中添加條件限制,也可以在readResolve中做。參考56條“保護性的編寫readObject”和“提供一個readResolve方法”。
4.當有非常復雜的對象需要提供deep clone時,可以考慮將其聲明為可序列化,不過缺點也顯而易見,性能開銷。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java Serializable
Serializable接口
Java 序列化的高級認識
理解Java對象序列化
Java對象的序列化和反序列化實踐
java序列化(Serializable)的作用和反序列化
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服