【问题标题】:Howto serialize and deserialize CDI Bean to file如何序列化和反序列化 CDI Bean 到文件
【发布时间】:2014-06-24 06:48:54
【问题描述】:

我正在构建一个 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;
    }
}

这可能吗?

【问题讨论】:

  • CDI 假设容器负责一切,包括序列化。

标签: java serialization cdi weld


【解决方案1】:

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

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

【讨论】:

  • 对象是否可以序列化不是问题,但我怎样才能反序列化一个bean并且仍然有CDI工作。或者,如果这甚至是可能的。 CDI本身管理bean的生命周期,我不知道是否可以覆盖一个已经被CDI管理的bean,而不破坏生命周期管理。
  • 试试这个: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>);.
  • 顺便说一句,您从未在问题中发布您的真正问题。这就是为什么我的答案是关于 Java 对象序列化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2017-05-16
  • 2012-11-21
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多