Serializable VS. Parcelable

start_up·2021년 6월 29일
0

Android

목록 보기
1/1

Serializable

Serializable(직렬화)는 Object(객체)또는 Data(데이터)를 Internal System에서도 사용이 가능하도록 byte 형태로 변환하는 것을 의미합니다.

Deserializable(역직렬화)는 byte 형태의 데이터를 다시 Object(객체)로 변환하는 것을 의미합니다.

Serializable는 아래와 같이 사용합니다.

@Serializable
data class Data(val a: Int, val b: String)

보시면 알겠지만, 구현해야 할 method가 없습니다.
즉, 마커 인터페이스(Marker Interface)입니다.

사용하기 쉽지만, 그만큼 cost가 늘어납니다.

Serializable은 Reflection을 사용합니다. 하지만, Reflection은 처리 과정에서 많은 추가 객체가 생성되면서 GC(가비지 컬렉터)의 target이 되면서 성능 저하를 유발합니다.

Parcelable

Parcelable은 Standard Java가 아닌 Android SDK의 Interface입니다.
Serializable과 다르게, Parcelable은 Reflection을 사용하지 않습니다.
왜냐하면, 직렬화 처리 방법을 개발자가 명시적으로 작성하기 때문입니다.
(물론, 그만큼 boilerplate code가 추가됩니다.)

예시 코드를 보겠습니다.

import kotlinx.parcelize.Parcelize

@Parcelize
data class User(val firstName: String, val lastName: String, val age: Int) : Parcelable {
    private companion object : Parceler<User> {
        override fun User.write(parcel: Parcel, flags: Int) {
            // Custom write implementation
        }

        override fun create(parcel: Parcel): User {
            // Custom read implementation
        }
    }
}

하지만, Parcelable은 구현과 유지, 보수에 드는 비용을 지불해야 합니다.

Serializable VS. Parcelable


이 그림을 보게 되면, 확실히 Parcelable이 빠릅니다.
하지만, Parcelable처럼 boilerplate code를 Serializable에서도 직접 작성해서 Customizable Serializable을 만든다면, 훨씬 빠릅니다.
Speed: Serializable < Parcelable < Custom Serializable


참고

profile
오늘도 시동 걸기 완료!

0개의 댓글