[android] Serializable, Parcelable

sundays·2023년 3월 26일
0

android

목록 보기
16/18
post-custom-banner

안드로이드에서 복잡한 클래스의 객체(POJO)들을 전달하게 될때 Serializable 또는 Parcelable 을 사용하여 직렬화를 한 후에 Intent에 추가 하는 방법을 사용합니다.

Serializable

  • import java.io.Serializable
  • Java Reflection 을 사용하여 직렬화를 처리합니다. 처리 과정중에 많은 추가 객체를 사용하여 앱의 GC가 발생되고 시스템 비용이 증가됩니다.
  • Marker Interface 로써 필수로 구현해야 할 코드가 없다
import java.io.Serializable

public class MySerializable import Serializable
{
    private String mData;

    public String getMData() {
        return mData;
    }

    public void setMData (String mData) {
        this.mData = mData;
    }
    
    @Override
    public String toString() {
        return String.format("Member{name='%d'}", mData);
    }	
}

Paraclable

  • import android.os.Paraclable
  • java Reflection 을 사용하지 않고 직렬화 방법을 사용자가 명시적으로 작성
  • 필수로 구현해야 하는 코드가 반복적으로 추가 되어 코드 가독성이 떨어짐
    • writeToParcel() : Parcel에서 데이터 복원
    • createFromParcel() : Parcel에 데이터 저장
public class MyParcelable implements Parcelable {
     private int mData;

     public int describeContents() {
         return 0;
     }
	
     // 객체가 보내지기 전에 데이터를 직렬화 시켜준다
     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

     public static final Parcelable.Creator<MyParcelable> CREATOR
             = new Parcelable.Creator<MyParcelable>() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

         public MyParcelable[] newArray(int size) {
             return new MyParcelable[size];
         }
     };
	
   	 // 객체를 받았을때 직렬화를 풀어주는 로직을 작성한다
     // Parcelable 을 이용하여 보내게 되면 받는 쪽에서도 Parcelabele을 통해서 데이터를 받는다
     // 이때 생성자를 통해 Parcelable 을 전달하여 Parcel 형이 들어오는 생성자를 만든다
     private MyParcelable(Parcel in) {
         mData = in.readInt();
     }
 }

결론

Serializable은 시스템 비용이 들며 Paraclable 은 사용자가 필수적으로 작성해야 하는 코드들이 존재합니다. 다만 SerializablewriteObject()readObject()를 따로 구현하면 속도가 개선되어 Paraclable 보다도 속도가 빨라질 수 있다고 합니다.

안드로이드에서는 @Parcelize Annotation을 선언하여 사용하면 data class들을 쉽게 직렬화 하는 것을 권장하고 있습니다. Reference에 Android Developer 를 참고 하면 됩니다.

Reference

profile
develop life
post-custom-banner

0개의 댓글