Да, вы можете, если будете управлять созданием 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
. Но лично мне больше нравится первый путь.
Является ли 'writeOrdinaryObject' призванным отражением? Или это взломать? –