如何序列化和反序列化CDI Bean到文件

时间:2014-06-24 06:48:55

标签: java serialization cdi weld

我正在构建一个JSF应用程序。 JSF应用程序包含一些CDI bean,用于保存会话数据。我想将此会话数据保存到文件中,并在以后加载它。

示例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:

会话范围的bean,它包含另一个应该加载的bean。

@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 个答案:

答案 0 :(得分:0)

无论您使用哪种框架,该类都可以序列化或不序列化。 CDI和JSF与您的问题无关。只要确保您的类及其所有字段都可以序列化/反序列化,如果您有一个无法序列化的字段,则将其标记为transient并通过实现{{1}建立规则以在对象反序列化上创建它方法。

注意:有些应用程序服务器为您启用此选项:将会话数据存储在磁盘中的文件中,以便在应用程序重新部署(如JBoss之后)后加载它(我在JBoss AS 7中测试了此行为)。没有必要重新发明轮子。