【问题标题】:CDI: Why does my transient field gets serialized?CDI:为什么我的瞬态字段会被序列化?
【发布时间】:2014-09-22 15:23:16
【问题描述】:

使用 CDI (Weld),我为不可序列化的类实现了生产者方法。如果生产者被序列化并且字段 NonSerializableObject 消失了,我会重新初始化一个 NonSerializableObject:

@SessionScoped
public class NonSerializableObjectProducer implements Serializable {

/** UUID */
private static final long serialVersionUID = -436472364723647647367L;

/** my transient non serializbale object */
private transient NonSerializableObject nonSerializableObject;

@SessionScoped
@Produces
protected NonSerializableObject produceNonSerializableObject() {
    if (nonSerializableObject == null) {
       // reinitialize object and set it
       // nonSerializableObject = ...
    }
    return nonSerializableObject;
}

我注入了一个 NonSerializableObject,例如:

@SessionScoped
public class UseSerializableObject implements Serializable {

    private static final long serialVersionUID = 62378785678643784689L;

    @Inject
    private transient NonSerializableObject nonSerializableObject;

    public void doSomething() {
        nonSerializableObject.go();
    }
}

当我的应用服务器(Tomcat 7)重新部署时出现以下异常:

Sep 22, 2014 4:41:58 PM org.apache.catalina.session.StandardSession writeObject
WARNING: Cannot serialize session attribute WELD_S#5 for session 4694BB90FF1BBD8
java.io.NotSerializableException: com.MemberOfNonSerializableObject 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1181)

所以,我的 NonSerializableObject 的成员变量被序列化了。为什么?我宣布一切都是短暂的!

【问题讨论】:

  • 我想,既然是@SessionScoped,它也存储在HttpSession中。失败的是 HttpSession 的序列化,而不是您的 UseSerializableObject 对象。

标签: java servlets serialization cdi


【解决方案1】:

你的方法:

@SessionScoped
@Produces
protected NonSerializableObject produceNonSerializableObject() {}

产生@SessionScoped 对象,该对象不可序列化。所有@RequestScoped、@SessionScoped 和@ApplicationScoped bean 都必须是可序列化的。

如果您从生产者方法中删除@SessionScoped,它会起作用。

【讨论】:

  • 既然你这么说,我好像明白了…… producer 方法不关心瞬态字段。我应该将 NonSerializableObject 的实例包装在带有瞬态字段的可序列化对象中。
  • 没有包装器,最好将生产者方法标记为@RequestScoped!所以不会有一个 NonSerializableObject 实例直接在 websession 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多