1. 직렬화란?
- 직렬화(Serialization)는 객체 인스턴스의 데이터를 I/O스트림에 적합한 일련의 데이터로 변환하는 과정이다.
- 이 과정을 거쳐 파일, 메모리 버퍼, 네트워크 전송을 통해 동일하거나 다른 컴퓨터환경에서 객체 인스턴스를 재구성할 수 있다.
- 객체 인스턴스는 메모리 주소 값을 저장하고 있기 때문에, 메모리 주소 값을 그대로 송신하면 수신 받는 쪽에서는 아무 쓸모 없는 데이터가 된다. 따라서 객체 인스턴스의 값의 형태로 변환이 필요하다.
- 역직렬화란?
- 역으로 스트림에 입력된 데이터를 읽어서 객체 인스턴스를 생성하는 것.
2. JAVA 객체 직렬화 구현
1) Serializable 구현
- 클래스 객체의 직렬화를 가능하게 하려면, Serializable이라는 인터페이스를 구현해야 한다.
- Serializable 인터페이스에는 메서드나 필드가 없으며, 직렬화 가능한 의미 체계를 식별하는 역할만 사용된다.
- Serializable 인터페이스를 구현하지 않은 클래스에서는 직렬화가 불가능하며, 인터페이스를 구현한 클래스를 상속받은 모든 하위 유형은 자체적으로 직렬화 할 수 있다.
- 직렬화하려는 클래스에서 제외하고 싶은 필드가 있다면, transient를 붙여 직렬화 대상에서 제외할 수 있다. 제외된 대상의 값은 null로 처리된다.
2) I/O Stream을 통해 직렬화 객체 입출력
- Java에선 ObjecInputStream / ObjectOutputStream 을 통해 객체의 데이터를 입출력 할 수 있다.
- 해당 스트림에는 java.io.Serializable 인터페이스를 지원하는 개체만 기록할 수 있다.
- writeObject 메서드는 해당 readObject 메서드가 복원할 수 있도록 특정 클래스에 대한 개체의 상태를 작성한다.
3) 예제
- 직렬화 하고자 하는 Class의 Serializable를 구현한다.
- Object I/O 스트림을 통해 객체 인스턴스를 파일에 저장한 후 불러와서 새로운 개체로 생성. 이과정에서 transient처리 된 필드 값을 null로 처리된걸 확인
- 파일형식이 아닌 ByteArrayStream을 통해 메모리에서 데이터를 불러와 새로운 개체로 생성. 이와 같은 예를 통해 객체의 깊은 복사도 손쉽게 가능하다.
3. serialVersionUID
serialVersionUID 를 통해 직렬화한 객체와 역직렬화할 객체의 버전이 일치하는지 확인한다.
serialVersionUID 를 직접 기술하지 않아도 내부적으로 serialVersionUID 정보가 추가되며,
내부 값도 자바 직렬화 스펙 그대로 자동으로 생성된 클래스의 해쉬 값을 이라는 것을 아래 사진을 통해 확인할 수 있다.
따라서 역직렬화 대상 클래스 구조가 바뀌면 에러 발생해야 되는 시스템이 아닌 경우, 클래스를 변경할 때에 직접 serialVersionUID 값을 관리해주어 에러 발생을 막을 수 있다.
4. 결론
직렬화(Serialization)는 생성한 객체 인스턴스의 데이터를 I/O스트림에 적합한 일련의 데이터로 변환하는 과정이다.
이 과정을 거친후 File, Memory 등의 타겟에 Stream을 통해 인턴스객체 데이터를 입출력할 수 있다.
이렇게 입출력한 데이터는 객체의 인스턴스를 재생성할 수 있으며, 이 구조는 객체의 깊은 복사와 같다.
Java에서는 이 직렬화를 하기 위해 직렬화가 필요한 클래스에 반드시 Serializable 인터페이스를 구현해야 하며, objectStream을 통하여 객체를 입출력 한다.
또한 Serializable 인터페이스를 구현한 클래스에는 자동으로 serialVersionUID의 값이 해쉬값으로 생성되어 지며,
역직렬화할때 해당 클래스와 버전이 일치하는지 확인한다.
여기서 직렬화할때의 필드와 역직렬화할때의 필드들이 다르다면 Exception이 발생하게 된다.
민감한 클래스가 아닌경우 serialVersionUID 변수를 클래스에 따로 선언을 해준 후, 버전이 달라도 호환가능하게 관리 할 수 있다.
'Language > ☕️Java' 카테고리의 다른 글
JVM 아키텍처 1탄 - Class Loader SubSystem (0) | 2021.12.08 |
---|---|
Java Collections 시간 복잡도 (0) | 2021.12.03 |
class파일로 컴파일 후, FTP를 통한 배포에서 발생한 문제. (UnsupportedClassVersionError ) (0) | 2021.08.14 |
String을 쓰지 말라는 이유 (1) | 2020.06.16 |
자바란? (Java Programming Language) (1) | 2020.06.15 |
댓글