JAVA-직렬화란?
Serializable(직렬화)
- 직렬화(Serializable)는 무엇인가?
- 직렬화는 자바 시스템 내부에서 사용되는 객체 또는 데이터들을 외부 자바 시스템에서도 사용할 수 있도록 바이트(byte)형태로 데이터를 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 역직렬화를 포함합니다.
- 시스템적으로 JVM의 Runtime Data Area(Heap and Stack Area)에 상주하고 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해 JVM으로 상주시키는 형태를 말하기도 합니다.
- 그렇다면 이런 직렬화는 어떤 경우에 사용되는 것일까?
- 생성한 객체를 가지고 파일에 저장할 때
- 저장한 객체를 읽어올 때
- 다른 서버에서 생성된 객체를 받을 때
즉 우리가 만든 클래스가 파일에 읽거나 쓰고, 다른 서버로 보내거나 받을 경우 반드시 이 직렬화를 이용하기 위해 Serializable interface를 implements해주어야 합니다.
public class Temp implements Serializable{
//다음과 같은 방식으로 implements하여 사용한다.
}
이러한 Serializable interface를 구현하는 클래스들을 확인해보면 serialVersionUID라는 값이 존재합니다.
이 serialVersionUID는 필수값은 아니지만 호환 가능한 클래스는 serialVersionUID 값이 고정되어있습니다.
serialVersionUID가 선언되어 있지 않으면 클래스는 기본 해쉬값을 사용합니다.
public class HashMap<K, V> extends TempMap<K,V>
implementes Map<K,V>, Serializable{
private static final long serialVersionUID = 123456789L;
}
이런식으로 static final long 으로 선언하고 변수명 역시 serialVersionUID로 선언해야 자바에서 인식합니다.
이러한 UID의 값은 언제 사용될까요?
처음 Serializable의 정의쪽을 기억해봅시다. "다른 서버로 보내거나 받을 경우"어떠한 클래스를 보내고자 할 때 받는 쪽 서버에도 역시나 동일한 클래스를 가지고 있을겁니다. 그러나 새로받은 클래스와 원래 존재했던 클래스가 단순히 이름만을 가지고 자바가 같다고 파악하지 않고 위에서 설명한 이 serialVersionUID를 통해 버전을 확인하고 두 버전이 동일 할 경우에만 같은 클래스로 인식하게 됩니다. 또한 UID가 같더라도 클래스 내부 변수의 개수나 타입등이 다르다면 이 경우에도 다른 클래스라 인식합니다.
Reference
'JAVA' 카테고리의 다른 글
Java - Logging 이란? (1) | 2024.11.12 |
---|---|
[JAVA & Database] JDBC, MyBatis, JPA 의 차이점 (1) | 2022.09.26 |
[Java] 언어의 특징 (2) | 2022.09.09 |
[JAVA]DAO, DTO, VO 정리. (0) | 2021.12.25 |