2016-09-15 2 views
1

임시 키워드는 정확히 무엇을 의미합니까?키워드 "transient"가 Java의 Servlet HTTPSession에 영향을주지 않는 이유는 무엇입니까?

public class NodeClassifier { 

    private transient HashMap<String, Node> nodeCache = new HashMap<>(); 

... 
} 

속성은 여전히 ​​이전 세션에서 값이있는 HttpSession이 내로 NodeClassifier 개체를 저장하고 복구 후 : 나는 과도로 표시된 클래스의 속성을 가지고있다.

비워서는 안됩니까?

환경은 Glassfish4에서 실행되는 일반 서블릿입니다.

+0

http://stackoverflow.com/questions/20700530/why-use-the-transient-keyword-in-java – imoteb

답변

5

transient은 객체가 바이트로 기록 될 때 (기본 Java 객체 직렬화를 사용하여) 값이 직렬화되지 않음을 의미합니다.

세션의 직렬화가 발생할 수도 있고 발생하지 않을 수도 있습니다 (프로세스간에 세션을 전달하거나 디스크에 유지하는 데 필요하지만 보통 메모리에 보관할 수있는 단일 JVM 서블릿 컨테이너에서는 필요하지 않음) 따라서 값을 "잃어버린"방식에 의존해서는 안됩니다.

물건을 세션에서 살아 남기를 원하지 않는다면 거기에 두지 마십시오. 요청 속성을 대신 사용해보십시오.

+1

좋습니다. 서버가 직렬화를 결정하지만 서버가 세션을 메모리에 유지하면 손실되지 않을 수도 있습니다. 그래서 transient는 실제로 세션 저장을 제한하기위한 것입니다. 세션에 무엇인가 넣을 때 속성을 정리하는 기본 방법이 있습니까? 콜백이나 비슷한가? 아니면 수동으로 코드를 작성해야합니까? – Marko

+1

요청 속성이 중첩 된 객체 구조이고 하나의 객체가 세션에서 지속될 때 지울 필요가있는 "캐시"를 가지고 있기 때문에 요청 속성이 나를 위해 작동하지 않습니다. – Marko

+1

아니요, 'transient'는 직렬화 작업을 수행하는 상당히 낮은 수준의 메커니즘입니다. 세션 저장소를 제한하지 않습니다. 세션은 당신이 넣은 모든 것을 저장해야합니다. – Thilo

관련 문제