Как сериализовать и десериализовать компонент CDI в файл

#java #serialization #cdi #weld

#java #сериализация #cdi #сварка

Вопрос:

Я создаю приложение JSF. Приложение JSF содержит некоторые компоненты CDI, которые содержат данные сеанса. Я хочу сохранить данные этого сеанса в файл и загрузить его позже.

Пример 1:

 @SessionScoped
MyBean implements Serializable {

    private String myValue;

    //getter and setters
}


@RequestScoped
MyLoadingService {

    @Inject
    private MyBean myBean;

    public void load(byte[] data){
        MyBean newMyBean = (MyBean)org.apache.commons.lang3.SerializationUtils.deserialize(data);

        //this doesn't work, because myBean is a proxy here...
        //how can I achieve this to work?
        myBean = newMyBean;
    }
}
  

Пример 2:

Компонент в области сеанса, который содержит другой компонент, который должен быть загружен.

 @SessionScoped
AnotherBean implements Serializable {

    private String otherValue;

    //getter and setters
}



@SessionScoped
MyBean implements Serializable {

    @Inject
    AnotherBean anotherBean;

    private String myValue;

    //getter and setters
}


@RequestScoped
MyLoadingService {

    @Inject
    private MyBean myBean;

    public void load(byte[] data){
        MyBean newMyBean = (MyBean)org.apache.commons.lang3.SerializationUtils.deserialize(data);

        //this doesn't work, because myBean is a proxy here...
        //how can I achieve this to work?
        myBean = newMyBean;
    }
}
  

Возможно ли это?

Комментарии:

1. CDI предполагает, что контейнер отвечает за все, включая сериализацию.

Ответ №1:

Класс может быть сериализован или нет, независимо от используемой вами платформы. CDI и JSF не имеют отношения к вашей проблеме. Просто убедитесь, что ваш класс и все его поля могут быть сериализованы / десериализованы, если у вас есть поле, которое нельзя сериализовать, затем пометьте его как transient и установите правила для его создания при десериализации объекта путем реализации readObject метода.

Примечание: существуют серверы приложений, которые включают эту опцию для вас: сохраните данные сеанса в файле на диске, чтобы загрузить его позже после повторного развертывания приложения, например, JBoss (я тестировал это поведение в JBoss AS 7). Нет необходимости изобретать велосипед.

Комментарии:

1. Вопрос не в том, можно ли сериализовать объект, а в том, как я могу десериализовать компонент и при этом сохранить работу CDI. Или, если это вообще возможно. CDI сам управляет жизненным циклом компонента, я не знаю, возможно ли переопределить компонент, который уже управляется CDI, не нарушая управление жизненным циклом.

2. Попробуйте это: Session session = /* fancy code to get the session */; session.setAttribute("<name of your CDI sessionscoper bean>", <new instance of the session scoped bean which has the external beans injected>); .

3. Кстати, вы никогда не публиковали свою реальную проблему в вопросе. Вот почему мой ответ касается сериализации объектов Java.