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 значение, которое в основном является хешем, вычисленным на основе всех полей.

Смотрите также:


Пометить несериализуемые поля transient

Если твой Serializable класс, в свою очередь, содержит поле / свойство, ссылающееся на экземпляр другого класса, который абсолютно не может быть сделан Serializable тогда вам нужно пометить его transient, Таким образом, он будет пропущен во время сериализации класса.

private transient SomeObject thisWillNotBeSerialized;

Вы должны понимать, что после десериализации это поле всегда будет null, Обратите внимание, что конструктор класса и блоки инициализации не вызываются во время десериализации. Если вы хотите более точно контролировать сериализацию и десериализацию, переопределите readObject() а также writeObject() методы. Вы можете найти конкретные примеры в ссылках ниже:


Почему сериализация?

Что касается того, почему вам нужно беспокоиться о сериализации, это потому, что большинству контейнеров сервлетов Java, таких как Tomcat, требуются классы для реализации. Serializable всякий раз, когда экземпляры этих классов хранятся в качестве атрибута HttpSession, Это потому что HttpSession может потребоваться сохранение в файловой системе локального диска или даже передача по сети, когда сервлет-контейнер должен быть выключен / перезапущен или помещен в кластер серверов, где сеанс должен быть синхронизирован.

Чтобы иметь возможность сохранять объекты Java в файловой системе локального диска или передавать их по сети, их необходимо сначала преобразовать в поток байтов (в основном: byte[] или InputStream) и это возможно, только если класс за объектом реализует Serializable, Serializable Сам интерфейс ничего не делает, это просто маркерный интерфейс.

Смотрите также:

Вам нужно сделать bean.ProjectAreaBean сериализации.

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