【发布时间】: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