Как сериализовать несериализуемый в Java?

Как я могу сериализовать объект, который не реализует Сериализуемый? Я не могу отметить его как Serializable, потому что класс из сторонней библиотеки.

5 ответов

Решение

Вы не можете сериализовать класс, который не реализует Serializable, но вы можете обернуть его в классе, который делает. Для этого нужно реализовать readObject а также writeObject в вашем классе-обертке, чтобы вы могли сериализовать его объекты по своему усмотрению.

  • Во-первых, сделайте свое несериализуемое поле transient,
  • В writeObjectпервый звонок defaultWriteObject в потоке для хранения всех непереходных полей, затем вызовите другие методы для сериализации отдельных свойств вашего несериализуемого объекта.
  • В readObjectпервый звонок defaultReadObject в потоке, чтобы прочитать все непереходные поля, затем вызвать другие методы (соответствующие тем, которые вы добавили в writeObject) для десериализации вашего несериализуемого объекта.

Я надеюсь это имеет смысл.:-)

Оберните несериализуемый класс в собственный класс, который реализует Serializable, В вашем классе writeObject метод, делайте все необходимое для сериализации достаточной информации о несериализуемом объекте, чтобы ваш класс readObject метод может восстановить это.

В качестве альтернативы, свяжитесь с разработчиком несериализуемого класса и попросите его исправить это.:-)

Если ваш класс уже реализует интерфейс Serializable (необходимый для сериализации), все, что вам нужно сделать, это объявить поле, которое вы не хотите сериализовать с помощью transient:

    public transient String description;

Вы можете использовать Kryo. Это работает на не сериализованных классах, но классы должны быть зарегистрированы заранее.

Если класс не является окончательным, вы можете создать свой собственный класс, который расширяет его и реализует Serializable. Существует много других способов сериализации, кроме встроенного в Java механизма.

Другие вопросы по тегам