[JAVA] Serializable 직렬화 역직렬화

yeonjoo913·2022년 11월 7일

JAVA

목록 보기
1/19

직렬화란

객체 데이터를 바이트(byte) 형태로 변환하는 것이다. 객체에 마구 쌓여 있는 데이터들이 바이트 단위로 정렬되는 형태이다. java.io 패키지의 Serializable 인터퍼이스를 implements하면 가능하다.직렬화 대상은 필드(멤버변수)들이다. 생성자와 메서드는 대상에 포함되지 않는다.

역직렬화란

직렬화된 파일 등을 역으로 직렬화하여 다시 객체의 형태로 만드는 것을 의미한다. 저장된 파일을 읽거나 전송된 스트림 데이터를 읽어 원래 객체의 형태로 복원한다.

직렬화 역직렬화를 사용하는 이유

데이터를 외부 서버로 전송하기 위해서이다.
자체 메모리 위에서만 데이터를 운용한다면 굳이 직렬화하지 않아도 객체를 주고 받을 수 있다. 그러나 객체를 DB에 저장하거나 파일로 저장한 객체를 전송하는 등의 상황에선 스트림을 통해 데이터를 보내는데 이때 바이트 단위로 보내야한다. 반대로 다른 서버로부터 객체를 받아올때 바이트 단위로 가져와서 다시 객체화하는 역직렬화도 사용한다.

직렬화, 역직렬화할 경우 객체들의 순서가 중요하다. ArrayList등을 활용하면 손쉽게 할 수 있다.


직렬화의 전제조건

직렬화가 가능한 클래스를 만든다.

여러가지 상황에 따라 직렬 가능한 클래스와 데이터가 결정된다.

  1. Serializable 인터페이스를 구현하는 클래스를 만든다.
public class A implements Serializable {

...

}
  1. Serializable 없는 경우
    Serializable을 implement한 클래스를 상속받는다.

  2. transient를 이용하여 직렬화 대상에서 제외하기
    보통 클래스의 멤버 변수 전부 직렬화 대상에 해당된다. 하지마 일부를 제외하고 싶다면 transient를 통해 지정할 수 있다.

  3. 다른 객체를 멤버 변수로 가지고 있는 경우
    int,String 등 기본 자료형 뿐만 아니라 다른 객체를 멤버 변수로 사용하는 경우가 많다. User클래스에 타 변수 객체 ShopInfo를 추가했다. 이때 , ShopInfo 클래스가 Serializable 인터페이스를 구현한 클래스가 아니라면 직렬화를 할 수 없다.


SerialVersionUID 클래스의 버전 관리

직렬화하면 내부에서 자동으로 SerialVersionUID라는 고유의 번호를 생성하여 관리한다. 이 UID는 직렬화와 역직렬화 할 때 중요한 역할을 한다. 이 값이 맞는지 확인 후 처리를 하기 때문이다.
생성 당시의 UID와 현재 변경한 이후의 UID가 맞지 않아서 문제가 발생한다. 서비스 배포 이후 객체의 변경은 끊임없이 변경될텐데...
그래서 JAVA에서는 이 SerialVersionUID를 직접 선언하고 관리하는 방식을 적극 권장하고 있다.

이렇게 선언한다면 추후에 클래스에 변경이 생길지라도 UID가 여전히 1이기 때문에 역질렬화를 성공적으로 할 수 있을 것이다.

참고 사이트
https://flowarc.tistory.com/entry/Java-%EA%B0%9D%EC%B2%B4-%EC%A7%81%EB%A0%AC%ED%99%94Serialization-%EC%99%80-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94Deserialization

profile
주니어 백엔드 개발자. 까먹는다 기록하자!

0개의 댓글