java.io.NotSerializableException 해결법

      java.io.NotSerializableException 해결법에 댓글 없음

서버 이중화 작업 후 발생한 직렬화 오류에 대한 해결 방법을 적어본다. 나의 경우 세션 클러스터링을 위해 sessionVO를 직렬화하는 도중에 이와 같은 오류가 발생했다. sessionVO안에 userVO 객체를 넣어 관리했다.

해결방법 1

오류가 발생한 user.UserVO가 직렬화 인터페이스 구현체인지 확인해보자. 아니라면 implements Serializable를 추가하자.

 

해결방법 2

오류 내용에 ‘$’문자열이 있다면 두가지 문제가 있을 수 있다.

첫째, 익명 객체가 존재하는 경우. 아래 예제는 UserVO 안의 내용이다. 생성되는 Function 객체는 익명 객체 상태로 사용되기 때문에 직렬화가 불가능하다. 아래와 같이 객체 생성 후 변수에 할당하고 사용하면 직렬화 가능하다.

둘째, 내부 객체가 직렬화 불가한 경우. 위의 코드 17line을 보면 UserAuthrtyVO 객체를 생성한다. 이 객체가 해결방법1처럼 직렬화 인터페이스 구현체로 구현되어 있어야한다.

 

해결방법 3

2번을 통해 문제를 해결했더니 ‘$’ 문자열 없이 sessionVO에서 오류가 발생했다. 직렬화의 대상이 되는 sessionVO에 어떤 값을 세팅할 때, 자바 기본 타입이나 Serializable 인터페이스를 구현한 객체를 사용해야 한다. 예제를 보면 쉽다.

 

완벽히 이해하고 쓴 글은 아니지만 시도했던 방법들을 잊지 않기 위해 작성한다. 정리해보면 직렬화 할 객체, 클래스 A는 직렬화 인터페이스 구현체여야 하고, 객체 A안에서 생성되는 객체, 클래스 또한 직렬화 인터페이스 구현체이어야 한다. 운영 환경에서 테스트해야 해서 굉장히 애먹었는데 해결된 것에 감사한다.