【问题标题】:How to override Externalizable to Serializable?如何将 Externalizable 重写为 Serializable?
【发布时间】:2011-10-27 16:46:12
【问题描述】:

您好,我有一些类扩展了一些我无法更改的给定接口。这些接口实现了Externalizable。但我想使用常规 Java 序列化来序列化我的对象。

基本上我希望序列化忽略Externalizable 并仅使用Serializable

有什么办法吗?

【问题讨论】:

    标签: java serialization


    【解决方案1】:

    是的,如果您控制了 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 应该被反射调用吗?或者它是一个黑客?
    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2012-03-10
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多