3 回答

TA貢獻1804條經(jīng)驗 獲得超7個贊
類似于@momo的答案,但不使用List和自動裝箱的int值,這將使其更加緊湊。
private void writeObject(ObjectOutputStream oos) throws IOException {
// default serialization
oos.defaultWriteObject();
// write the object
oos.writeInt(location.x);
oos.writeInt(location.y);
oos.writeInt(location.z);
oos.writeInt(location.uid);
}
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
// default deserialization
ois.defaultReadObject();
location = new Location(ois.readInt(), ois.readInt(), ois.readInt(), ois.readInt());
// ... more code
}

TA貢獻1830條經(jīng)驗 獲得超9個贊
如果必須是Java序列化,我唯一知道的方法就是重新定義readObject()
和writeObject()
,并且在所有類中都引用實例,Location
如Momo的答案所示。請注意,這將不允許您序列化Location[]
,并要求您對Collection<Location>
代碼中出現(xiàn)的所有子類進行子類化。此外,它要求將類型的字段Location
標記為瞬態(tài),這會將它們的定義排除在寫入序列化流之外,從而有可能挫敗不兼容類更改的檢測。
更好的方法是簡單地重寫ObjectOutputStream.writeObject
。that,那個方法是final
。您可以改寫ObjectOutputStream.writeObjectOverride()
,但是該方法不能委托默認實現(xiàn),ObjectOutputStream.writeObject0()
因為該方法是private
。當然,您可以使用反射來調(diào)用私有方法,但是...
因此,我建議驗證您的約束。一定要Java序列化嗎?您真的不能更改類的定義Location
嗎?
如果您有要分類的源代碼Location
,則將其添加implements Serializable
并將其添加到您的classpath中非常簡單。是的,每當升級庫時,都必須再次執(zhí)行此操作,但是它可能比其他方法更好...
添加回答
舉報