Я только что наткнулся на некоторые проблемы с сериализацией в недавнем проекте.
Хотя есть некоторые распространенные ошибки, такие как bean-компоненты, находящиеся в области видимости без реализации Serializable
, есть некоторые более сложные проблемы, на которые у меня пока нет ответа.
1) Как бороться с @ManagedProperty
, когда внедренный экземпляр не сериализуем?
В этом случае внедряется определенный сервис, реализованный как синглтон-компонент Spring
. Несмотря на то, что я мог бы пометить атрибут transient
, после десериализации управляемого компонента он оставил бы атрибут null
. Другой, довольно неэстетичный подход состоит в том, чтобы пропустить атрибут и выполнить поиск, когда требуется услуга (вероятностный инкапсулирован в методе getService()
).
Хотя существует подход для Spring
bean-компонентов, использующих прокси с заданной областью, я не уверен, как решить эту проблему, когда Spring
не используется или другой bean-компонент, отличный от Spring с более долгоживущей областью действия, чем «Request», вводится.
2) Во время проверки ViewMap
я заметил, что иногда он не сериализуем из-за некоторых встроенных классов Mojarra
, которые по умолчанию не сериализуемы, например, javax.faces.view.facelets.ConverterHandler
. Я все равно не понимаю, почему это было положено Mojarra
в ViewMap
.
3) С замечаниями, сделанными в 2):
Необходимо ли, чтобы ViewMap был сериализуемым со стандартными методами сериализации Java? Насколько я понимаю, все, что заканчивается HttpSession
, должно быть сериализуемым, но, возможно, есть какой-то скрытый трюк сериализации, примененный Mojarra
, о котором я не знаю.
4) Десериализация, кажется, никогда не произойдет, если только не установлен com.sun.faces.serializeServerState
.
Я поместил private void writeObject(ObjectOutputStream out) throws IOException
и private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
в бин @ViewScoped
, чтобы увидеть, как происходит сериализация. Но интересно, пока writeObject
вызывается после завершения жизненного цикла, readObject
никогда не вызывается, кроме случаев, когда указано выше context-param
. Это приводит к вопросу, почему объекты сериализуются, когда они никогда не будут десериализованы.
Эти наблюдения были сделаны с Mojarra 2.1.6 на Tomcat 7.0.11.
Было бы замечательно, если бы кто-то с большим пониманием мог пролить свет на это.
Thx