嗨我有類擴展一些給定的接口,我不能改變。這些接口實現Externalizable
。但我想用常規的Java序列化來序列化我的對象。如何重寫Externalizable到Serializable?
基本上我想系列化忽略Externalizable
和使用Serializable
只有
任何方式做到這一點?
嗨我有類擴展一些給定的接口,我不能改變。這些接口實現Externalizable
。但我想用常規的Java序列化來序列化我的對象。如何重寫Externalizable到Serializable?
基本上我想系列化忽略Externalizable
和使用Serializable
只有
任何方式做到這一點?
是的,你可以控制OutputStream的創建。
通常我們使用ObjectOutputStream.writeObject()
來編寫可序列化的對象。此方法檢查標誌'enableOverride'。如果該標記爲真,則它調用方法writeObjectOverride()
,其可被ObjectOutputStream
的子類覆蓋。
因此,解決方案如下。創建的ObjectOutputStream
實現writeObjectOverride()
子如下:
protected void writeObjectOverride(Object obj) throws IOException {
if (isMySpecialClass(obj.getClass())) {
// call writeOrdinaryObject(obj, desc, unshared); using reflection because this method is private
return;
}
// fall back to regular mechanism.
}
你可以從評論看,你將不得不調用使用反射基類的一些方法,因爲它們是私有的(不要忘了叫setAccessible(true)
)。但這是可能的。我相信這項任務可以在幾個小時內完成。
祝你好運。
順便說一句,另一個解決方案是使用字節碼修改。您可以使用各種庫來動態修改字節碼,因此請使用類Serializable
而不是Externalizable
。但我個人更喜歡第一種方式。
'writeOrdinaryObject'應該被反射調用嗎?或者它是一個黑客? –