취미처럼

[JAVA] 객체 직렬화 본문

JAVA/이론

[JAVA] 객체 직렬화

sirius 2021. 3. 22. 09:49

자바 객체의 직렬화(Serializable)

자바에서 입출력에 사용되는 것은 스트림이라는 데이터 통로를 통해 이동하는 형태이다.

하지만 객체는 바이트형이 아니라서 스트림을 통해 파일에 저장하거나 네트워크로 전송할 수 없다.

따라서 객체를 스트림을 통해 입출력 하기 위해서는 바이트 배열로 변환하는 것이 필요한데, 이를 직렬화라고 한다.

반대로 스트림을 통해 받은 직렬화된 객체를 원래 모양으로 만드는 과정을 역직렬화라고 한다.

 

직렬화 조건

1. 기본형 타입(int, char, String, short, double, long, byte 등등)은 직렬화가 가능하다.

2. Serializable 인터페이스를 구현한 객체여야 한다.

3. transient가 사용된 멤버는 전송되지 않는다.

4. 생성자나 메소드는 직렬화 대상에 속하지 않는다.

 

serialVersionUID를 선언해야 하는 이유

JVM은 직렬화와 역직렬화를 하는 시점의 클래스에 대한 버전 번호를 부여한다.

만약 그 시점에 클래스의 정의가 바뀌어 있다면 새로운 버전 번호를 할당한다.

그래서 직렬화할 때의 버전 번호와 역직렬화를 할 때의 버전 번호가 다르면 역직렬화가 불가능하게 될 수도 있다.

이런 문제를 해결하기 위해 SerialVerionUID를 사용한다.

serialVersionUID값을 저장할 때 클래스 버전이 맞는지 확인하기 위한 용도이다.

만약 직렬화할 때 사용한 serialVersionUID의 값과 역직렬화 하기 위해 사용했던 serialVersionUID값이 다르다면 InvalidClassException이 발생할 수 있다.

'JAVA > 이론' 카테고리의 다른 글

[JAVA] MessageDigest  (0) 2021.03.22
[JAVA] 예외처리  (0) 2021.03.22
[JAVA] 정규식  (0) 2021.03.22
[JAVA] 날짜, 시간  (0) 2021.03.22
[JAVA] JVM  (0) 2021.03.22
Comments