런타임노트

자바 직렬화(serialize)? serialVersionUID? 본문

JAVA

자바 직렬화(serialize)? serialVersionUID?

D269 2023. 2. 24. 13:45
728x90

 

오늘 사수님이 intelliJ serialVersionUID 생성하는 플러그인 있는거 알고있었냐는 메신저가 왔다.

ㅇㅅㅇ?

바로 구글링.

 

직렬화(serialize)란?

컴퓨터의 메모리 상에 존재하는 데이터를 파일로써 저장하거나, 통신하는 다른 컴퓨터에게 알맞은 형식에 맞추어 전달하기 위해 "바이트 스트림" 형태로 만드는 것.

알맞은 형식 ? 자바에서는 "클래스"를 의미함.

 

 

그럼 왜 "직렬화"라고 해?

프로그램에서 사용되는 데이터들은 연속적으로 위치해 있지 않고 내부적으로 포인터에 의해 참조 되고 있다. 
-> 이거는 프로그램이 실행 중인 컴퓨터에서만 인식할 수 있는 형태임.

다른 컴퓨터랑 통신하면서 데이터를 알맞게 전달하기 위해서는 흩뿌려져 있는 데이터를 한 데 모아 "포인터가 존재하지 않는 일련의 바이트 형태"로 만들어서 보내야함 -> "직렬화"

 

JAVA에서 직렬화 구현하는 법

  • 직렬화하고자 하는 클래스에 implements Serializable
  • Serializable은 "마커 인터페이스"이기 때문에 따로 구현할 메서드는 존재하지 않음.

 


 

SerialVersionUID 란?

영어 그대로 해석하면 직렬화 버전의 고유값!

 

즉, 직렬화/역직렬화를 할 때 이 값으로 해당 클래스의 특정 버전에 맞는지 아닌지를 판단하겠다는 것.

 

그럼 이 값을 선언하지 않으면 직렬화가 불가능하다??

-> 아니요.

 

자바 스펙에 따르면 serialVersionUID가 선언되어 있지 않아도 default 값으로 만들어준다고 한다.

하지만, 컴파일러의 구현에 따라 달라질 수 있기 때문에 역직렬화를 실패할 수도 있다.

 

그러니 필수적으로 선언하도록 하자!!!

 

 

 

 

 

 

출처 : https://velog.io/@hellonewtry/%EC%9E%90%EB%B0%94-%EC%A7%81%EB%A0%AC%ED%99%94%EB%9E%80-serialVersionUID-%EB%9E%80

728x90
반응형