Непериализуемые атрибуты в LogicalViewMap - PullRequest
1 голос
/ 29 февраля 2012

Я только что наткнулся на некоторые проблемы с сериализацией в недавнем проекте. Хотя есть некоторые распространенные ошибки, такие как 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

...