【发布时间】:2011-10-27 16:46:12
【问题描述】:
您好,我有一些类扩展了一些我无法更改的给定接口。这些接口实现了Externalizable。但我想使用常规 Java 序列化来序列化我的对象。
基本上我希望序列化忽略Externalizable 并仅使用Serializable
有什么办法吗?
【问题讨论】:
标签: java serialization
您好,我有一些类扩展了一些我无法更改的给定接口。这些接口实现了Externalizable。但我想使用常规 Java 序列化来序列化我的对象。
基本上我希望序列化忽略Externalizable 并仅使用Serializable
有什么办法吗?
【问题讨论】:
标签: java serialization
是的,如果您控制了 OutputStream 的创建,则可以。
通常我们使用ObjectOutputStream.writeObject() 来编写可序列化的对象。此方法检查标志“enableOverride”。如果标志为真,它会调用方法writeObjectOverride(),该方法可以被ObjectOutputStream 的子类覆盖。
所以,解决方案如下。创建实现writeObjectOverride() 的ObjectOutputStream 的子类,如下所示:
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 应该被反射调用吗?或者它是一个黑客?