Aiden
5 min readJul 29, 2019

직렬화(Serialization)와 Java Serializable, Android Parcelable까지

직렬화(Serialization)란?

참고자료 : Wikipedia

1. 데이터 구조나 객체 상태를 저장할 수 있게(파일이나 메모리에), 전송할 수 있게(통신을 통해) 변환하는 과정

2. 1에서 변환된 상태를 다시 원래의 상태로 되돌리는 과정

1은 marshalling(마샬링)이라고도 부르며, 2는 deserialization(역직렬화) 또는 unmarshalling(언마샬링)이라고도 부른다.

직렬화의 다양한 방법은 상기 블로그롤 참고하자. 이번 블로그는 직렬화의 방법중 Java의 Interface로 제공되는 Serializable과 Android SDK에서 제공하는 Parcelable을 중점으로 살펴 볼 것이다.

Java Serializable이란?

참고자료 : wikipedia

Java provides automatic serialization which requires that the object be marked by implementing the java.io.Serializable interface. Implementing the interface marks the class as “okay to serialize”, and Java then handles serialization internally.

Java에서는 자동으로 직렬화를 위한 인터페이스를 제공한다. 사용법은 단순히 사용할 곳에 java.io.Serializable을 implements하면 된다. implements하면 JVM내부에서 자동으로 직렬화, 역직렬화를 처리한다.

장점은 사용하기 편리하다는 것이다. 직렬화나 역직렬화에 대한 추가 코드가 필요없이 Serializable만 implements하면 된다.

단점은

  1. 데이터 타입추가와 변경에 대해 매우 엄격하다(serialVersionUID 의 관리 문제 포함)
  2. 상대적으로 다른 포맷에 비해 용량이 크다
  3. 성능 저하 문제가 존재한다.

3에 대해 부연설명을 하자면, Serializable 은 내부에서 Reflection 을 사용하여 직렬화를 처리하는데, Reflection 은 프로세스 동작 중에 사용되며 처리 과정 중에 많은 추가 객체를 생성 한다. 많은 쓰레기들은 가비지 컬렉터의 타겟이 되고 가비지 컬렉터의 과도한 동작으로 인하여 성능 저하 및 배터리 소모가 발생한다

참고자료

*Reflection : 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법

Android Parcelable이란?

Parcelable은 Android SDK에서 제공하는 직렬화 인터페이스이다. Parcelable은 내부적으로 Reflection을 사용하지 않게 설계되었다. Serializable과 다르게 사용자(개발자)가 직렬화 처리방법을 명시해야하기 때문이다.

장점은 Reflection이 사용되지 않기 때문에 성능상 이점을 가진다는 점이다.

단점은 사용자가 직접 직렬화 처리방법을 명시해야하기 때문에 생기는

  1. 보일러플레이트 코드 증가
  2. 이로인한 개발자의 개발시간 추가 및 유지보수 복잡성 증가

두가지의 단점이 있다.

그래서 Serializable이랑 Parcelable 중 어떤걸 써야하는거야?

상기 블로그를 참조하면, 잘 구현된 Serializable이 Parcelable 보다 빠른 퍼포먼스를 낼 수 있다고 한다. 두가지의 선택안

  1. Parcelable의 사용
  2. Serializable을 사용하되, writeObject()와 readObject() 메서드에 특정 클래스 처리 로직을 추가

중 본인이 원하는 방식으로 사용하면 될 것 같다.

Aiden

안드로이드 개발자(개인 공부용도의 블로그)