[英]differences and similarities between defaultWriteObject and writeObject of java ObjectOutputStream methods
我正在嘗試了解java序列化機制,我幾乎沒有懷疑
請回答以下有關java序列化的問題:
oos.defaultWriteObject();
? 根據這篇文章,它的存在是為了向后兼容。 而且我不太明白它是如何實現的。序列化的不兼容更改之一是刪除較新版本中的字段。 這意味着舊版本將不得不設置有時對用戶無效的默認值。這與添加新字段並允許設置默認值的新版本有何不同?oos.defaultWriteObject();
是否有任何區別oos.defaultWriteObject();
和oos.writeObject(address);
兩者不做同樣的事情嗎? 我的意思是將所有超類和當前類的非瞬態非靜態字段寫入 OOS。這里
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException {
stream.writeObject(name);
stream.writeInt(id);
stream.writeObject(DOB);
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
name = (String) stream.readObject();
id = stream.readInt();
DOB = (String) stream.readObject();
}
上面的代碼產生與下面的代碼相同的結果
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException {
stream.defaultWriteObject();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
}
什么時候使用這兩種方法,什么時候只使用 writeObject(employee); //員工是我的全部對象//
writeObject
不是為了向后兼容。 readObject
是。defaultWriteObject
是幫助您快速編寫“可序列化”值。考慮您的 bean 添加了一個新字段。
class Bean implements Serializable {
int id;
String name;
String newValue = "123";
}
盡管您已提供newValue
默認值,但 java 序列化將忽略它。 (因為它分配實例而不是new
實例)
現在,如果您不使用readObject
,您將獲得newValue=null
。 所以你還需要在readObject
進行初始化。
private void readObject(ObjectInputStream stream) throws Exception {
stream.defaultReadObject();
this.newValue = "123";
}
defaultWriteObject
如何幫助您考慮到您的 bean 幾乎是“可序列化的”,除了某些字段。
請參閱以下代碼。 BadThing
不可Serializable
或者它有一些您不想序列化的敏感數據。
class Bean implements Serializable {
int id;
String string;
BadThing badThing;
}
要快速序列化它,您可以讓字段transient
並編寫writeObject
方法來處理它
private void writeObject(ObjectOutputStream stream) throws Exception {
stream.defaultWriteObject();
stream.writeInt(badThing.id);
}
// Corresponding `readObject`
當然,您可以將defaultWriteObject
替換為多個writeXXX
。 但是如果你有很多很多字段,寫代碼很累很無聊吧?
所以defaultWriteObject
只是為了讓您免於編寫無聊的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.