java.io.WriteAbortedException: запись прервана;java.io.NotSerializableException - PullRequest
18 голосов
/ 19 февраля 2010

Что вызывает такого рода ошибки в 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 ]

44 голосов
/ 27 июля 2012

Просто внедрите 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 (обычно это представляют ресурсы, такие как InputStream, Connection и т. Д.) тогда вам нужно будет пометить transient. Таким образом, он будет пропущен во время сериализации класса.

private transient SomeObject thisWillNotBeSerialized;

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


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

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

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

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

3 голосов
/ 19 февраля 2010

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

...