gpt4 book ai didi

java - CDI:为什么我的 transient 字段被序列化?

转载 作者:行者123 更新时间:2023-12-01 22:42:11 26 4
gpt4 key购买 nike

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

@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;
}

我注入(inject)一个 NonSerializedObject,如下所示:

@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)

因此,我的 NonSerializedObject 的成员变量被序列化。为什么?我宣布一切都是短暂的!

最佳答案

你的方法:

@SessionScoped
@Produces
protected NonSerializableObject produceNonSerializableObject() {}

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

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

关于java - CDI:为什么我的 transient 字段被序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25977706/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com