본문 바로가기
JAVA

Serialization

by orioncsy 2023. 5. 9.

Serialization

개념

직렬화

  • 자바 시스템에서 사용하는 객체나 데이터를 외부의 자바 시스템에서 사용할 수 있도록 바이트 형태로 변환하는 기술
  • 각자의 PC의 운영체제에서는 다른 가상 메모리 주소를 사용하기 때문에 참조 타입의 인스턴스는 전달할 수 없다.
  • 이러한 문제를 해결하기 위해 주소값을 바이트 형태로 변환하여 데이터를 전달할 필요가 존재
  • 직렬화된 데이터는 원시 타입으로 변환되고 파일 저장이나 전송할 때 유의미한 데이터가 된다. 이 과정을 직렬화이다.

역직렬화

  • 직렬화를 통해 변환된 바이트 데이터를 다시 자바 객체나 데이터 형태로 변환하는 기법

직렬화 조건

구현 방식

  • java.io.serializable 인터페이스를 구현으로 직렬화, 역직렬화가 가능

대상

  • 인터페이스를 구현한 구현체, 원시 타입 데이터
  • 참조 타입처럼 주소 값을 가지고 있다면 인터페이스를 구현해야 한다.

상황

  • JVM에 존재하는 데이터를 영속화할 때 사용
  • Servlet session
    • 일정 시간 동안 같은 사용자로부터 들어오는 일련의 요구를 하나의 상태로 보고 유지하는 기술이 session
  • Cache
  • Java RMI(Remote Method Invocation)
    • 분산되어 존재하는 객체 간의 메시지 전송을 가능하게 하는 프로토콜

구현

직렬화

  • ByteArrayOutputStream 객체를 생성하고 ObjectOutputStream 객체를 생성할 때 넘겨준다.
  • ObjectOutputStream 객체에 writeObject() 메서드에 객체를 인자에 전달한다.
  • ByteArrayOutputStream 객체에 toByteArray() 메서드를 통해 바이트 배열 형태로 저장한다.

역직렬화

  • ByteArrayInputStream 객체를 생성하고 생성 인자에 바이트 배열 데이터를 전달한다.
  • ObjectInputStream 객체를 생성할 때 ByteArrayInputStream 객체를 넘겨준다.
  • ObjectInputStream의 readObject() 메서드를 사용하여 Object 형태로 저장
  • 형변환을 통해 객체에 저장한다.

SerialVersionUID

개발자 관리

  • serialVersionUID는 자동으로 해시값이 설정된다.
  • 그러나 맴버 변수가 변경되면 serialVersionUID도 변경된다.
  • 직접 관리를 해야 serialVersionUID가 변경되어 예외가 발생하는 것을 예방할 수 있다.

Reference

https://gyoogle.dev/blog/computer-language/Java/Serialization.html

'JAVA' 카테고리의 다른 글

Null 처리  (0) 2023.05.12
Object Class  (0) 2023.05.08
Generic  (0) 2023.04.28
Record  (0) 2023.04.18
String  (0) 2023.04.17