2011-10-27 73 views
3

嗨我有類擴展一些給定的接口,我不能改變。這些接口實現Externalizable。但我想用常規的Java序列化來序列化我的對象。如何重寫Externalizable到Serializable?

基本上我想系列化忽略Externalizable和使用Serializable只有

任何方式做到這一點?

回答

1

是的,你可以控制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。但我個人更喜歡第一種方式。

+0

'writeOrdinaryObject'應該被反射調用嗎?或者它是一個黑客? –