객체 직렬화 - Serializable
Android 에서는 activity 간 데이터를 전달하기 위해 인텐트에 데이터를 추가한다.
전달할 데이터가 class 인 경우 Serializable or Parcelable 을 사용하거나 Bundle 을 이용해 객체 직렬화를 해야한다.
이번 포스팅에서는 객체 직렬화에 대해 알아보자.
직렬화 & 역직렬화
◼ 직렬화 (Serialize)
자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술.
JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
◼ 역직렬화 (Deseialize)
Byte 로 변환된 data를 원래대로 object 나 data로 변환하는 기술.
직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM 으로 상주시키는 형태.
Why?
각기 다른 process 들은 서로 데이터를 주고 받을 수 없다.
(메모리를 공유할 수 없다.)
다른 process 에 데이터를 전달하기 위해 IPC (Inter Process Communication) 를 사용한다.
IPC 는 byte stream 전송이 가능하므로 직렬화가 필요하다.
Serializable
Serializable 은 Android SDK 가 아닌 JAVA interface 로 해당 class 가 직렬화 대상이라고 알려주는 marker interface 이다.
(Serializable 은 reflection 을 사용하여 직렬화를 처리함으로 성능저하가 발생할 수 있다.)
직렬화의 방법은 "implements Serializable" 를 상속만 하면 된다.
상속만 받으면 자동으로 직렬화가 처리된다.
단, 하단과 같은 조건은 만족해야 한다.
- 직렬화 class 는 송신, 수신 모두 동일해야 한다.
- 직렬화 class 의 패키지 명이 같아야 한다.
- serialVersionUID 가 같아야 한다.
◼ 직렬화 class (송수신 공통)
◼ 송신부
◼ 수신부
Source code
◼ 송신부
https://github.com/parkho79/SerializeSender
◼ 수신부
https://github.com/parkho79/SerializeReceiver