[개념] 안드로이드 Serializable

쓰리원·2022년 6월 1일
0
post-thumbnail

1. Serializable이란?

Serializable은 Java의 표준 인터페이스 입니다. 이 기법의 장점은 Marker Interface로서 단순히 implement하는 것만으로도 JVM에게 직렬화가 가능하다는 것을 알려주기 때문에 구현이 간편하다는점이 있습니다. 자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야기합니다.

2. Serializable 적용

1. Data.kt

Serializable를 적용할 Data 클래스를 만들어 줍니다.

data class Data (
    var name:String,
    var age:Int
) : Serializable

2. SendActivity.kt

class SendActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_send)

        Log.d("Log","SendActivity")

        val data = Data("ha",20)
        val intent = Intent(this,ReceiveActivity::class.java)
        intent.putExtra("key",data)
        startActivity(intent);
    }
}

name과 age를 가지는 데이터클래스 Data를 SendActivity에 정의 했습니다. 데이터클래스를 전달하기 위해서는 Serializable 혹은 Parcelable 과정을 거쳐 데이터를 변환해야 한다. 여기서는 Serializable를 사용하겠습니다.

3. ReceiveActivity.kt

class ReceiveActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_receive)

        Log.d("Log","ReceiveActivity")

        val data = intent.getSerializableExtra("key") as Data
        Log.d("Log","value : "+ data)
    }
}

데이터 클래스를 직렬화하여 전달했기 때문에 데이터를 받을 때도 getSerializableExtra를 이용하여 받아야 합니다. 그리고 'as'를 이용하여 해당 클래스로 캐스팅 해야합니다.

3. Serializable 와 reflection

위 코드처럼 일반 class 형태에서 Serializable만 구현하면 됩니다. 하지만 단점으로는 Parcelable보다 속도가 느립니다. 왜냐하면 Serializable은 reflection이라는 기술을 사용기 때문입니다. 프로그램 런타임에 데이터를 직렬화/역직렬화하는 과정에 많은 객체를 생성하고 덕분에 GC가 할일이 늘어나게 됩니다. 그래서 CPU에 부하가 갑니다. 프로젝트의 사이즈가 커져서 Serializable을 사용하는 객체가 많아지면 많아질수록 성능에는 안좋은 영향을 미치게 됩니다.

profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글