2011-10-27 2 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)). Но это возможно. Я считаю, что эта задача может быть выполнена через пару часов.

Удачи.

BTW еще одно решение использует модификацию байтового кода. Вы можете изменить байтовый код на лету, используя различные библиотеки, поэтому сделайте класс для реализации Serializable вместо Externalizable. Но лично мне больше нравится первый путь.

+0

Является ли 'writeOrdinaryObject' призванным отражением? Или это взломать? –