참고: Serialization and Deserialization in Java with Example
Java에서 입출력 시 스트림을 이용하는데, 스트림에서는 바이트 형태로 데이터를 전송한다.
→ 따라서 자바 객체를 바이트 배열로 변환하는 직렬화, 바이트 배열에서 객체로 변환하는 역직렬화를 사용한다.
직렬화 (Serialization)
객체를 바이트 스트림으로 변환하는 메커니즘
- 객체의 상태를 네트워크를 통해 전송이 가능해짐
- 직렬화된 바이트 스트림은 플랫폼에 독립적 > 다른 플랫폼에서 역직렬화 가능
- java.io.Serializable 인터페이스를 구현하거나 Serializable 인터페이스를 구현한 클래스를 상속받은 클래스의 객체만 직렬화할 수 있다.
- Serializable 은 마커 인터페이스
마커 인터페이스 데이터 멤버, 메서드가 없는 인터페이스
클래스의 객체가 특정 기능을 얻을 수 있도록 Java 클래스를 표시하는 데 사용하는 인터페이스
역직렬화 (Deserialization)
바이트 스트림을 사용하여 메모리에 자바 객체를 재 생성하는 직렬화의 반대 과정이다.
- 객체가 역직렬화될 때 해당 객체의 생성자는 호출되지 않는다.
직렬화 특징
- 직렬화 과정에서 해당 클래스에 포함된 멤버 변수 전체가 직렬화 대상이 된다. 일부를 제외하고 싶은 경우 transient를 사용해서 지정하면 직렬화 대상에서 제외할 수 있다.
ex) attr1 은 직렬화되지만, attr2 는 직렬화 되지 않는다.
public class SerializableClass implements Serializable {
private int attr1;
private transient int attr2;
}
- 일시적 변수 (transient var):
transient 키워드로 정의된 변수는 직렬화 과정에서 직렬화되지 않는다. 해당 변수는 역직렬화 과정에서 기본값(default value)으로 초기화된다. - 정적 변수:
정적 키워드로 정의된 변수는 직렬화 과정에서 직렬화되지 않는다. 해당 변수는 역직렬화 과정에서 클래스에 정의된 현재 값으로 로드된다.
'CS > Backend' 카테고리의 다른 글
[Spring] 서블릿, HTTP request & response (0) | 2023.06.27 |
---|---|
[Spring] Pagiantion, Pageable 인터페이스 (0) | 2023.06.27 |
[Spring] REST, REST API (0) | 2023.06.23 |
[Spring] 웹 애플리케이션 개념 정리 (0) | 2023.06.22 |
[이슈] Spring boot 프로젝트 실행 시 html 파일을 찾지 못하는 에러, whitelabel error page (0) | 2023.06.13 |