Кластеризация проекта Java для высокой доступности: как сериализовать классы из сторонних фреймворков, используемых в проекте?

Я размещаю свой проект на Payara Server с кластеризацией для высокой доступности. Мой проект находится в Java Web, и он использует JSF Framework с Primefaces с некоторыми расширенными классами, такими как, например, DataTable (org.primefaces.component.datatable.DataTable).

Поскольку этот класс не реализует сериализуемый интерфейс, я не могу добиться успеха при сбое репликации сервера, поскольку сервер требует сериализации всех классов.

Что мне делать в этой ситуации, когда мне нужно сериализовать все классы, но я не могу контролировать классы, используемые сторонними фреймворками?


person lucianovcnt    schedule 04.07.2018    source источник
comment
Что нельзя сериализовать? Состояние просмотра JSF?   -  person Kukeltje    schedule 04.07.2018
comment
Одним из них является атрибут DataTable, импортированный из простых лиц. Например: import org.primefaces.component.datatable.DataTable; общедоступная таблица данных DT;   -  person lucianovcnt    schedule 04.07.2018
comment
Да, это и так было понятно, но где это используется? В состоянии просмотра, в собственном поврежденном бобе? Что такое «корневой» класс, который сериализуется для репликации. Если это ваш компонент, вы можете пометить его как переходный.   -  person Kukeltje    schedule 04.07.2018
comment
Да, @Kukeltje, на моем ManagedBean с ViewScoped. Уже пробовал ставить как переходный, но не получилось.   -  person lucianovcnt    schedule 04.07.2018
comment
Вы пробовали собственный несериализуемый класс с переходным процессом (возможно, даже с несериализуемым свойством)? Это сработало? Если нет, то дело не в PrimeFaces и можно поискать, почему не работает переходный процесс. Если да, то это ценная информация. И как вы сделали это временным: stackoverflow.com/questions/14582440/   -  person Kukeltje    schedule 05.07.2018
comment
Пример кода поможет нам понять, что вы делаете. Также любая ошибка в журналах или исключениях. Вы сказали, что уже пытались использовать ключевое слово transient, но, вероятно, применили его неправильно.   -  person OndroMih    schedule 11.07.2018
comment
Спасибо вам, ребята ! сохранение в моем тесте в конечном итоге сработало правильно, используя переходный процесс.   -  person lucianovcnt    schedule 24.07.2018


Ответы (2)


вам нужно изменить сериализацию вашего bean-компонента viewScoped, который ссылается на несериализуемый объект DataTable. Для этого необходимо реализовать методы writeObject(java.io.ObjectOutputStream out) и readObject(java.io.ObjectInputStream in), как описано в Javadoc для Serializable. Вы можете использовать метод out.defaultWriteObject для сериализации всех сериализуемых полей и написать пользовательскую сериализацию только для вашего объекта DataTable.

Но я бы серьезно подумал об удалении объекта DataTable из сериализации, пометив поле transient. DataTable — это сложный объект, который может тратить много памяти, если включен в сеанс. Лучше хранить только те данные, которые необходимы для воссоздания объекта DataTable. Обычно вы должны сохранять только свою модель данных объекта DataTable.

person OndroMih    schedule 10.07.2018
comment
Я действительно думаю, что вы правы, но OP уже пытался пометить как переходный согласно комментариям. А еще я написал что-то о правильном 'transient' (не `@Transient)) но ответа нет уже почти неделю... Я склоняюсь к idownvotedbecau.se/beingunResponse - person Kukeltje; 10.07.2018

Многие пользователи используют compoment-"binding" для bean-компонентов с областью просмотра, чего следует избегать. Прочтите: https://myfaces.apache.org/orchestra/component-bindings.html

Классы компонентов по своей конструкции не сериализуемы.

Вы всегда можете искать их лениво через API findComponent.

person tandraschko    schedule 10.07.2018