자바 스윙(java swing)을 이용한 채팅 프로젝트를 하고 있는데 모든 클래스에 노란줄이 있다.. 

사실 바로 전에 계산기 만들 때도.. 계속 함께 했다... 

대체 왜 뜨냐고!!! 

 

>> serializable과 관계가 있다.

 

 

그래도 일단 해결 방법을 앞에다가 적어야지~~

#노란 경고메시지 없애는 해결 방법

1. Add default serial version ID

2. Add generated serial version ID

3. Add @SuppresWarnings 'serial' to Object

그냥 3개 중 선택해서 눌러주면 된다.ㅇㅅㅇ

 

 

이제 이유를 알아볼 차례!!

# serializable(직렬화)

1. serializable(직렬화)가 무엇이지?

- 객체의 데이터를 일렬로 늘어선 연속적인 바이트로 변경하는 것 

 

 

자바는 메모리에 생성된 객체를 파일이나 네트워크로 입출력할 수 있다.  그런데 객체는 문자가 아니기 때문에 바이트 기반 스트림으로 입출력해야 한다. 

 

왜냐하면 자바에서 데이터는 stream을 통해 입출력되는데(java.io 패키지에서 제공), 스트림 클래스는 크게 두 종류로 구분된다.

1. 바이트 기반 스트림 -> 그림, 멀티미디어, 문자 등 모든 종류 데이터

2. 문자 기반 스트림 -> 문자

 

따라서 객체를 출력하기 위해서는 객체의 데이터를 일렬로 늘어선 연속적인 바이트로 변경해야 하는데, 이것을 객체 직렬화라고 한다.

그리고 전송된 객체를 입력 스트림으로부터 읽어들인 것을 복원하는 것을 deserialization(역직렬화)라고 한다.

 

이것은 java.io.Serializable 이라는 인터페이스로 구현되어 있고,

직렬화하려는 클래스에 Serializable 인터페이스를 implements 하게 된다. 

그런데 Serializable 인터페이스를 implements 하게 되면 노락색 경고 메시지가 나온다.

The serializable class MainFrame does not declare a static final serialVersionUID field of type long

나처럼 무시해도 상관없지만..ㅎ 이유는 알아야 하니깐...

 

# Warning 이유

serialVersionUID는 직렬화에 사용되는 고유 아이디인데, 객체를 직렬화할 때 serialVersionUID도 저장이 된다.

만약 선언하지 않으면 JVM에서 default로 자동 생성된다. 

따라서 선언하지 않아도 동작하는데 문제가 없지만, 불안하기 때문에 명시적으로 선언할 것을 권장하는 것이다.

 

고유 아이디? 왜 불안한가?

모든 class는 UID를 가지고 있는데 내용이 변경되면 UID값도 변경된다. 

만약 직렬화하여 통신하는데 UID 값이 바뀌게 되면 다른 class로 인식하기 때문에 명시를 해주는 것이다.

 

 

그래서 노란색 경고 메시지가 뜨는 것이고, 

내가 작성한 클래스에 extends한 상위 클래스나 implements를 따라가보면 implements Serializable 부분을 발견할 것이다.

 

 

한번 찾아보기로 했다.

1. ctrl 를 누른 상태로 JFrame 클릭하면 JFrame 클래스로 이동한다. 

 

2. implements serializable가 없어서 Frame 도 보고 implements한 WindowConstants, Accessible.. 전부 보다가 TransferHandler를 눌렀는데!!!!!!!

 

 

3. 발견했다..!

그런데 TransferHandler 뭐하는 놈이지...

위로 올려서 package를 보니까 "package javax.swing; 이네??

docs 보니까 이 클래스는 Swing의 컴포넌트와........생략하도록 하자. 

 

나는 3번으로 해결했다!

+ Recent posts