Android

Parcelable vs Serializable

park_juyoung 2019. 1. 9. 15:19

안드로이드 앱을 개발할 때 종종 하나의 액티비티 에서 다른 액티비티 로 데이터를 전달하기 위해 인텐트에 전달할 데이터를 추가 합니다.

복잡한 클래스의 객체를 이동하려는 경우 Serializable 또는 Parcelable 를 사용하여 직렬화 하여 인텐트에 추가 해야 합니다. 

Serializable 이란 무엇인가?

serial(직렬의) + ~able(~가능한) Serializable 
Serializable 은 Android SDK 가 아닌 표준 Java 의 인터페이스 입니다.


이 인터페이스를 구현한 클래스의 객체는 이제 한 액티비티 에서 다른 액티비티 로 이동할 준비가 됩니다. 다음 코드에서 이 인터페이스를 사용하는 것이 얼마나 간단한 지 알 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.io.Serializable;
 
public class Person implements Serializable {
 
    private String firstName;
    private String lastName;
    private int age;
 
 
    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
 
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getLastName() {
        return lastName;
    }
 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
cs


다. 간단하게 implements Serializable 을 추가 하는것으로 Person객체를 다른 액티비티에 전달할 수 있습니다.


사용방법이 쉽다는것은 곧 시스템 적인 비용이 비싸다는것을 의미 합니다.


Serializable 은 내부에서 Reflection 을 사용하여 직렬화를 처리합니다.

Reflection은 프로세스 동작 중에 사용되며 처리 과정 중에 많은 추가 객체를 생성합니다.

이 많은 쓰레기들은 가비지 컬렉터의 타켓이 되고 가비지 컬렉터의 과도한 동작으로 인하여 성능 저하 및 배터리 소모가 발생합니다.


Parcelable 은 무엇인가?


Parcelable 은 직렬화를 위한 또다른 인터페이스 입니다. Serializable 과는 달리 표준 Java 가 아닌 Android SDK 의 인터페이스 입니다.

 Parcelable 은 Reflection을 사용하지 않도록 설계되었습니다. Serializable 과는 달리 직렬화 처리 방법을 사용자가 명시적으로 작성하기 때문에 자동으로 처리하기 위한 Reflection이 필요 없습니다.

다음의 코드에서 Parcelable 인터페이스의 사용법을 볼 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import android.os.Parcel;
import android.os.Parcelable;
 
public class Person implements Parcelable {
 
    private String firstName;
    private String lastName;
    private int age;
 
 
    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
 
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getLastName() {
        return lastName;
    }
 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
 
    @Override
    public int describeContents() {
        return 0;
    }
 
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.firstName);
        dest.writeString(this.lastName);
        dest.writeInt(this.age);
    }
 
    protected Person(Parcel in) {
        this.firstName = in.readString();
        this.lastName = in.readString();
        this.age = in.readInt();
    }
 
    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel source) {
            return new Person(source);
        }
 
        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };
}
cs


물론, Parcelable 을 사용할 때 지불해야하는 비용도 있습니다.


마커 인터페이스인 Serializable 과는 달리 Parcelable 은 구현 해야 하는 필수 메서드를 포함하기 때문에 클래스에 보일러 플레이트 코드가 추가 됩니다.

이는 클래스를 이해하기 어렵고, 새로운 기능을 추가하기 힘들게 만듭니다.

또한 코드의 추가로 클래스가 복잡해 질수록 유지 보수가 어려워지는 원인이 됩니다.


Serializable 이 시스템 비용이 발생한다면 Parcelable 구현과 유지,보수에 드는 사용자의 노력을 비용으로 지불해야 합니다.


Parcelable VS Serializable



Serializable

-장점: 마커 인터페이스이기때문에 사용자가 사용하기 쉽다.

-단점:그만큼 시스템적인 비용이 비싸다 (내부적으로 Reflection이 사용되기때문에)


Parcelable

-장점 : 직렬화 처리 방법을 사용자가 직접 작성하므로 내부적인 Reflection이 필요없다.

             따라서 시스템적인 부담이 적으며 빠르다.

-단점 : 구현에 필요한 메서드 때문에 보일러 플레이트 코드가 추가됨.

              유지 보수가 어려워짐.