Сериализация в Java с несериализуемыми частями
Я столкнулся с проблемой сериализации в Java. У меня есть следующий код:
class MyClass extends MyClass2 implements Serializable {
//...
}
В классе MyClass2
есть свойство, которое не поддерживает сериализацию. Как я могу сериализовать (и десериализовать) объекты этого класса, учитывая данное ограничение?
Также хочу уточнить, что MyClass2
— это класс, а не интерфейс. Спасибо за помощь!
5 ответ(ов)
MyClass2 — это всего лишь интерфейс, поэтому технически он не имеет свойств, только методы. Тем не менее, если у вас есть экземплярные переменные, которые сами по себе не могут быть сериализуемыми, единственный способ, который я знаю, чтобы обойти эту проблему — это объявить эти поля как transient
.
Пример:
private transient Foo foo;
Когда вы объявляете поле как transient
, оно будет игнорироваться в процессе сериализации и десериализации. Имейте в виду, что при десериализации объекта с полем transient
значение этого поля всегда будет его значением по умолчанию (обычно null
).
Кроме того, вы можете переопределить метод readResolve()
вашего класса, чтобы инициализировать поля transient
в зависимости от другого состояния системы.
Если вы можете изменить MyClass2, то самый простой способ решить эту проблему — объявить свойство временным (transient).
Зависит от того, почему тот элемент MyClass2 не является серилизованным.
Если есть обоснованная причина, по которой MyClass2 нельзя представлять в серилизованной форме, то, скорее всего, та же причина относится и к MyClass, так как он является подклассом.
Возможно, вы сможете написать пользовательскую серилизованную форму для MyClass, реализовав методы readObject и writeObject таким образом, чтобы состояние данных экземпляра MyClass2 в MyClass можно было адекватно восстановить из серилизованных данных. Это будет правильным решением, если API MyClass2 фиксирован, и вы не можете добавить интерфейс Serializable.
Но сначала вам следует выяснить, почему MyClass2 не является серилизованным, и, возможно, внести изменения.
Чтобы реализовать сериализацию, вам потребуется реализовать методы writeObject()
и readObject()
, а также выполнить ручную сериализацию и десериализацию полей объекта. Для получения более подробной информации ознакомьтесь с документацией java.io.Serializable
. Кроме того, в книге Джоша Блоха Effective Java есть хорошие главы, посвященные разработке надежной и безопасной сериализации.
Вы можете начать с изучения ключевого слова transient, которое помечает поля как не входящие в постоянное состояние объекта.
Что такое serialVersionUID и почему его следует использовать?
Jackson: Сериализация и десериализация значений enum в виде целых чисел
Java: Статические transient-поля
Что значит 'synchronized'?
Как объявить массив в одну строку?