직렬화 / 역직렬화

joona95·2023년 11월 27일

Java 이론 공부

목록 보기
4/7
post-thumbnail

📌 직렬화와 역직렬화

직렬화

  • 객체를 저장 혹은 전송할 수 있는 특정 타입의 데이터로 바꾸는 것

역직렬화

  • 특정 타입의 데이터를 객체로 바꾸는 것

JSON, CSV, XML, Binary, Java 직렬화/역직렬화

  • 직렬화/역직렬화가 개념이라면, JSON 등은 직렬화/역직렬화한 특정 타입의 데이터들이다.

📌 Java 에서의 직렬화

public class Person implements Serializable {
  public static final long serialVersionUID = 123L;
  
  private long id;
  private String name;
  private transient int age;
  
  public Person(long id, String name, int age) {
    this.id = id;
    this.name = name;
    this.age = age;
  }
}

Serializable 인터페이스

  • 다른 특별한 기능 없이 Serializable 인터페이스를 구현한 객체는 직렬화 가능하다는 걸 알리는 역할을 한다.

  • 자바 내부에서 사용되는 객체를 바이트 타입의 데이터로 변환해준다.

  • 다른 객체를 멤버변수로 가지고 있는 경우에는 해당 객체 클래스도 Serializable 인터페이스를 구현했어야 직렬화할 수 있다.

serialVersionUID

  • 버전 정보가 맞지 않은 경우 역직렬화 과정에서 오류가 발생할 수 있다.

  • serialVersionUID 값이 같아 버전이 동일한 경우에는 멤버 변수 및 메서드 추가가 있어도 오류 없이 역직렬화가 이루어질 수 있다.

  • 직렬화 시에 따로 serialVersionUID 선언을 하지 않더라도 내부적으로 추가되므로 명시적으로 선언하는 편이 좋다.

transient 키워드

  • transient 키워드를 변수 앞에 선언할 경우 해당 변수는 직렬화 대상에서 제외할 수 있다.

  • 비밀번호와 같이 민감한 정보를 제외하고 싶을 경우 사용한다.

  • 역직렬화 시 transient 선언된 변수는 해당 타입의 기본 값으로 초기화된다.

ObjectStream

  • ObjectOutputStream과 ObejctInputStream는 객체를 직렬화/역직렬화할 수 있는 메소드를 제공하는 스트림이다.

  • ObjectStream 사용하기 위해서는 객체가 직렬화되어 있어야 한다.

  • reflection으로 가져올 수 있는 정보를 바이너리로 바꾸고 객체로 받아올 수 있다.


참고

0개의 댓글