有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaCDI:为什么我的瞬态字段被序列化?

使用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;
}

我注入了一个非序列化对象,如:

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

因此,非序列化对象的成员变量被序列化。为什么?我宣布一切都是暂时的


共 (1) 个答案

  1. # 1 楼答案

    你的方法是:

    @SessionScoped
    @Produces
    protected NonSerializableObject produceNonSerializableObject() {}
    

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

    因此,如果您将@SessionScoped从producer方法中删除,它将起作用