2014-09-22 3 views
0

CDI (Weld)를 사용하여 비 직렬화 가능 클래스에 대한 생성자 메소드를 구현했습니다.CDI : 왜 내 필드가 직렬화됩니까?

@SessionScoped 
public class UseSerializableObject implements Serializable { 

    private static final long serialVersionUID = 62378785678643784689L; 

    @Inject 
    private transient NonSerializableObject nonSerializableObject; 

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

내 응용 프로그램 서버 (톰캣 7) 다음 다시 배포 할 때 :

@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를 주입 : 생산자가 직렬화 및 NonSerializableObject가 없어 분야 받았다면, 나는 NonSerializableObject를 다시 초기화 예외가 발생합니다.

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의 멤버 변수는 serialize를 가져옵니다. 디. 왜? 나는 모든 것을 과도하다고 선언했다!

+1

'@ SessionScoped'이므로 'HttpSession'에도 저장되어 있다고 생각합니다. 그것은 당신의'UseSerializableObject' 객체가 아니라'HttpSession'의 직렬화입니다. –

답변

3

귀하의 방법

@SessionScoped 
@Produces 
protected NonSerializableObject produceNonSerializableObject() {} 

가 직렬화되지 @SessionScoped 객체를 생성합니다. @RequestScoped, @SessionScoped 및 @ApplicationScoped Bean은 모두 Serializable이어야합니다.

생산자 방법에서 @SessionScoped를 제거하면 작동합니다.

+0

이제는 말하지만, 나에게 분명해 보입니다 ... 생산자 방식은 일시적인 필드에 대해 신경 쓰지 않습니다. Transient 필드를 사용하여 직렬화 가능 객체에 NonSerializableObject 인스턴스를 래핑해야합니다. – Ginkgochris

+0

래퍼가 없으므로 제작자 메소드 @RequestScoped를 표시하는 것이 좋습니다! 따라서 웹 세션에는 NonSerializableObject 인스턴스가 직접 존재하지 않습니다. – Ginkgochris

관련 문제