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를 가져옵니다. 디. 왜? 나는 모든 것을 과도하다고 선언했다!
'@ SessionScoped'이므로 'HttpSession'에도 저장되어 있다고 생각합니다. 그것은 당신의'UseSerializableObject' 객체가 아니라'HttpSession'의 직렬화입니다. –