직렬화(Serialization)

수호천사임다·2024년 10월 14일

자바

목록 보기
9/15

직렬화

  • 자바 시스템 내부에서 사용되는 객체 또는 데이터를 자바 외부에서도 사용할 수 있도록 바이트(byte) 단위로 변환하는 것을 말한다.
  • 직렬화가 가능한 자료형 및 객체
    ᆞ 기본형 타입(boolean, char, byte, short, int, long, float, double)
    ᆞ Serializable 인터페이스를 구현한 클래스의 객체
    ᆞ transient 가 사용된 멤버변수(null 전송), static 멤버변수, 메소드는 직렬화 대상에서 제외된다.

역 직렬화

  • 직렬화 된 바이트 단위의 데이터를 다시 원래 데이터로 복원하는 것을 말한다.

바이트단위로 바꾸는 걸 - 직렬화

객체를 직렬화 하기 위해서는 먼저, 객체를 직렬화가 가능하도록 Serializable 인터페이스를 구현해야 한다.

  • 이 인터페이스는 객체 직렬화가 제공되어야 함을 JVM에 알려주는 역할을 한다.

  • Serializable 인터페이스는 다른 인터페이스와는 달리 구현해야 할 메서드가 없다.

  • 객체의 직렬화 대상에서 제외되는 것은 멤버 변수가 static으로 선언된 경우, 멤버 변수가 transient로 선언된 경우와 메서드이다.

  • 직렬화는 필드만 된다.

  • ObjectOutputStream을 사용하면 객체 인스턴스를 직렬화해서 byte로 변경할 수 있다.

  • ObjectInputStream을 사용하면 byte를 역직렬화해서 객체 인스턴스로 만들 수 있다.

transient

  • 직렬화 대상에서 제외할 멤버 변수는 transient 키워드를 사용하여 제외
  • transient 키워드가 붙은 멤버 변수가 복원되면, 숫자변수는 0, 객체는 null로 설정
public class 클래스명 implements Serializable{
접근제어자 자료형 변수1;
접근제어자 transient 자료형 변수2;
// 클래스 구현
}

serialVersionUID 필드

  • serialVersionUID는 직렬화에 사용되는 고유 아이디로, 선언하지 않으면 JVM에서 디폴트로 자동 생성된다. serialVersionUID는 역 직렬화 해서 읽어 들일 때 캐스팅한 클래스의 serialVersionUID와 역직렬화 한 serialVersionUID가 맞는지 확인하기 위해 사용된다.
  • 선언하지 않아도 동작하는데 문제는 없지만, JVM에 의한 디폴트 serialVersionUID 계산은 클래스의 세부 사항을 매우 민감하게 반영하기 때문에 컴파일러 구현체에 따라서 달라질 수 있어 역 직렬화 과정에서 예상하지 못한 InvalidClassException을 유발할 수 있다.
  • JAVA에서는 명시적으로 serialVersionUID를 선언한 것을 적극 권장하고 있다.
    private static final long serialVersionUID = 1L;

0개의 댓글