본문 바로가기

카테고리 없음

Serialization,Parcel,Parcelable

직렬화란(Serialization)?

Serializable 어디서 많이 봤을 것이다. Retrofit을 사용할 때 모델 클래스에 @Serializable 이라는 어노테이션을 붙여서 사용하는데 그렇다면 이게 왜 필요할까?

직렬화는 객체를 전송 가능한 형태로 만들어주는 것이다.
즉 객체 데이터를 연속적인 데이터로 변형해서 데이터를 읽을 수 있도록 하는 것이다.

역직렬화란(Deserialization)?

이름에서부터 감은 왔을텐데 말 그대로 직렬화된 파일의 스트림 데이터를 읽어서 원래 객체의 형태로 복원하는 과정이다.

 

Parcel이란

짐을 싸듯이 객체를 싸는 클래스이다 , paecel 클래스는 직렬화시 Containner역할을 하는 클래스로 말 그대로 꾸러미이다

 

안드로이드는 프로세스간 통신을 위해 bundle클래스를 사용하는데 이러한 bundle class는 map으로 key와 value가 있는 형태의 클래스이다. 이러한 bundle에서 int나 String 같은 간단한 데이터는 그대로 value 값으로 넣을 수 있지만 java의 pojo나 beans 혹은 kotlin의 data class와 같은 것들은 내부에 많은 데이터가 들어가 있기 때문에 map에 value로 입력하는 것이 어렵 습니다. 이러한 문제점을 개선하여 bundle에 value값으로 입력될 수 있는 것이 바로 parcel이다 serializable 이용하여 직렬화하여 전달도 가능하지만 더 효율적으로 데이터를 전달하기 위해 리플렉션을 사용하지 않는 parcelable interface를 사용하여 parcel를 만들어 bundle(MAP)에 넣어준다

 

Parcelable이란? 

Parcel을 만들고 비직렬화하기 위한  인터페이스다 Paecel을 만듥 풀수 있다 Parcekable을 이용하면 Serializable과 다르게 리플랙션을 사용하지 않고 필요한 부분만을 직렬화하고 비직렬화 할 수 있도록 만들 수 있어 효율성을 향상시킬수 있다

 

Parcelable 한계와 문제점

Parcelable을 구현하는 것은 직접 구현해야 하기 때문에 보일러 플레이트 코드(비슷한 코드 반복)가 생기게 되며, Serializable에 비해 코드 작성이 오래 걸리게 된다

 

해결방법 : Kotlin-paecelize plugin

  1. plugin { id 'kotlin-parcelize'}
  2. @Parcelize Annotaion을 data class 위에 추가해주고 뒤에 Parcelable을 implement 시킨

 

 

728x90