직렬화
- 자바 시스템 내부에서 사용되는 객체 또는 데이터를 자바 외부에서도 사용할 수 있도록 바이트(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;