728x90
Parcelable과 Serializable은 객체를 직렬화하여 전달하기 위한 방법이다.
직렬화 : 객체들의 데이터를 연속적인 데이터(스트림)로 변형하여 전송 가능한 형태로 만드는 것
역직렬화 : 직렬화된 데이터를 다시 객체의 형태로 만드는 것
객체 데이터를 통신하기 쉬운 포맷(Byte, CSV, Json..) 형태로 만들어주는 작업을 직렬화라고 볼 수 있고,
역으로, 포멧(Byte,CSV,Json..) 형태에서 객체로 변환하는 과정을 역직렬화라고 할 수 있겠다.
(이해에 도움이 될 수도 있음)
Parcel 이란 한국어로 꾸러미 라는 뜻이다. 객체를 싸는 클래스가 바로 Parcel 클래스
Parcel 이 필요한 이유
안드로이드에서 프로세스 간 통신을 위해 Bundle 을 사용하는데, Key 와 Value 쌍으로 이루어져 있는 형태이다.
이러한 Bundle 에서 원시타입(Primitive Type) Int, String, boolean.... 같은 간단한 데이터는 그대로 Value 값으로 넣을 수 있지만, Kotlin의 data class 같은 것들은 내부에 많은 데이터가 들어 있기 때문에 Map에 Value 값으로 입력하는 것이 어렵다.
이런 문제가 있어서 Bundle에 Value 값으로 입력될 수 있는 것이 Parcel
Parcelable와 차이
Parcelable
- Parcelable은 안드로이드에서 제공하는 인터페이스로, 객체를 전달하기 위해 사용
- Parcelable 인터페이스를 구현한 객체는 안드로이드 OS에서 Intent나 Bundle에 담아 전달할 수 있음
- Parcelable을 사용하면 객체를 직렬화하여 안드로이드 OS에서 처리할 수 있는 바이트 배열로 변환하여 전달
Serializable
- Serializable은 Java에서 제공하는 인터페이스로, 객체를 직렬화하여 전달하기 위해 사용
- Serializable을 사용하면 객체를 바이트 스트림으로 변환하여 전달할 수 있음
- Serializable 인터페이스를 구현한 객체는 Java에서 제공하는 ObjectOutputStream을 사용하여 전달할 수 있음
1. 속도
- Parcelable이 Serializable보다 빠름
- Paecelable은 안드로이드 OS에서 직접 처리하기 때문에 직렬화와 역직렬화 시간이 적고, Serializable은 Java의 Reflection을 사용하기 때문에 상대적으로 느림
- Serializable은 ObjectOutputStream과 ObjectInputStream을 사용하기 때문에 객체를 직렬화하는 시간이 더 길어 짐
2. 크기
- Parcelable은 Java의 Serializable보다 객체를 직렬화할 때 생성되는 데이터 크기가 작음
- 객체의 멤버 변수들을 Parcel에 쓰기 때문에 필요한 데이터만 쓰게 됨
- Serializable은 객체의 모든 데이터를 직렬화하기 때문에 불필요한 데이터까지 모두 쓰게 되어서 상대적으로 데이터 크기가 큼
3. 안정성
- Parcelable은 Serailizable 보다 안정성이 높음
- Parcelable은 직렬화와 역직렬화에 대한 오류 검사를 수행하기 때문
4. 그 외
- Parcelable은 안드로이드 OS에서만 사용할 수 있음
- Parcelable을 사용하여 전달한 객체는 안드로이드 애플리케이션에서만 사용할 수 있음
- 객체 크기가 작고 안드로이드 OS에서만 사용하는 경우 Parcelable을, 객체 크기가 크거나 다른 플랫폼과도 호환해야 하는 경우 Serializable을 사용하는 것이 좋음