0

Сериализация в Java с несериализуемыми частями

9

Я столкнулся с проблемой сериализации в Java. У меня есть следующий код:

class MyClass extends MyClass2 implements Serializable {
  //...
}

В классе MyClass2 есть свойство, которое не поддерживает сериализацию. Как я могу сериализовать (и десериализовать) объекты этого класса, учитывая данное ограничение?

Также хочу уточнить, что MyClass2 — это класс, а не интерфейс. Спасибо за помощь!

5 ответ(ов)

0

MyClass2 — это всего лишь интерфейс, поэтому технически он не имеет свойств, только методы. Тем не менее, если у вас есть экземплярные переменные, которые сами по себе не могут быть сериализуемыми, единственный способ, который я знаю, чтобы обойти эту проблему — это объявить эти поля как transient.

Пример:

private transient Foo foo;

Когда вы объявляете поле как transient, оно будет игнорироваться в процессе сериализации и десериализации. Имейте в виду, что при десериализации объекта с полем transient значение этого поля всегда будет его значением по умолчанию (обычно null).

Кроме того, вы можете переопределить метод readResolve() вашего класса, чтобы инициализировать поля transient в зависимости от другого состояния системы.

0

Если вы можете изменить MyClass2, то самый простой способ решить эту проблему — объявить свойство временным (transient).

0

Зависит от того, почему тот элемент MyClass2 не является серилизованным.

Если есть обоснованная причина, по которой MyClass2 нельзя представлять в серилизованной форме, то, скорее всего, та же причина относится и к MyClass, так как он является подклассом.

Возможно, вы сможете написать пользовательскую серилизованную форму для MyClass, реализовав методы readObject и writeObject таким образом, чтобы состояние данных экземпляра MyClass2 в MyClass можно было адекватно восстановить из серилизованных данных. Это будет правильным решением, если API MyClass2 фиксирован, и вы не можете добавить интерфейс Serializable.

Но сначала вам следует выяснить, почему MyClass2 не является серилизованным, и, возможно, внести изменения.

0

Чтобы реализовать сериализацию, вам потребуется реализовать методы writeObject() и readObject(), а также выполнить ручную сериализацию и десериализацию полей объекта. Для получения более подробной информации ознакомьтесь с документацией java.io.Serializable. Кроме того, в книге Джоша Блоха Effective Java есть хорошие главы, посвященные разработке надежной и безопасной сериализации.

0

Вы можете начать с изучения ключевого слова transient, которое помечает поля как не входящие в постоянное состояние объекта.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь