Просто внедрите 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
проверку атрибута сеанса, чтобы действовать соответственно.
Смотри также: