java.io.WriteAbortedException: запись прервана; java.io.NotSerializableException
Что вызывает такого рода ошибки в Tomcat?
SEVERE: Exception loading sessions from persistent storage
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:
bean.ProjectAreaBean
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1333)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at java.util.ArrayList.readObject(ArrayList.java:593)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(
DelegatingMethodAccessorImpl.java:25)
2 ответа
Просто реализовать Serializable
Если вы получаете NotSerializableException
как следует,
java.io.NotSerializableException: bean.ProjectAreaBean
тогда это просто означает, что класс идентифицируется по полному имени в сообщении об исключении (которое bean.ProjectAreaBean
в вашем случае) не реализует Serializable
Интерфейс пока это ожидается кодом. Исправить это относительно просто, просто позвольте классу реализовать Serializable
интерфейс.
package bean;
import java.io.Serializable;
public class ProjectAreaBean implements Serializable {
private static final long serialVersionUID = 1L;
// ...
}
serialVersionUID
Поле не обязательно, но настоятельно рекомендуется, так как оно поддерживает двоичную совместимость между различными версиями класса и сериализованными представлениями его экземпляров. Поэтому, когда вы позже добавите новое сериализуемое поле в класс, вам нужно будет изменить serialVersionUID
поле (обычно достаточно просто увеличить его на 1), чтобы предотвратить проблемы при десериализации экземпляра более старой версии класса. IDE, такие как Eclipse, также предлагают возможность (пере) генерировать serialVersionUID
значение, которое в основном является хешем, вычисленным на основе всех полей.
Смотрите также:
- Управляемый компонент JSF вызывает java.io.NotSerializableException во время развертывания Tomcat
- Внедрение несериализуемого bean-объекта области применения как управляемое свойство сериализуемого bean-объекта области действия в кластере
- Что такое serialVersionUID и почему я должен его использовать?
Пометить несериализуемые поля transient
Если твой Serializable
класс, в свою очередь, содержит поле / свойство, ссылающееся на экземпляр другого класса, который абсолютно не может быть сделан Serializable
тогда вам нужно пометить его transient
, Таким образом, он будет пропущен во время сериализации класса.
private transient SomeObject thisWillNotBeSerialized;
Вы должны понимать, что после десериализации это поле всегда будет null
, Обратите внимание, что конструктор класса и блоки инициализации не вызываются во время десериализации. Если вы хотите более точно контролировать сериализацию и десериализацию, переопределите readObject()
а также writeObject()
методы. Вы можете найти конкретные примеры в ссылках ниже:
- Запрет сериализации дерева компонентов для определенных частей приложения
- Как сделать постоянные файлы cookie с помощью DefaultHttpClient в Android?
Почему сериализация?
Что касается того, почему вам нужно беспокоиться о сериализации, это потому, что большинству контейнеров сервлетов Java, таких как Tomcat, требуются классы для реализации. Serializable
всякий раз, когда экземпляры этих классов хранятся в качестве атрибута HttpSession
, Это потому что HttpSession
может потребоваться сохранение в файловой системе локального диска или даже передача по сети, когда сервлет-контейнер должен быть выключен / перезапущен или помещен в кластер серверов, где сеанс должен быть синхронизирован.
Чтобы иметь возможность сохранять объекты Java в файловой системе локального диска или передавать их по сети, их необходимо сначала преобразовать в поток байтов (в основном: byte[]
или InputStream
) и это возможно, только если класс за объектом реализует Serializable
, Serializable
Сам интерфейс ничего не делает, это просто маркерный интерфейс.