Serializable은 Java의 표준 인터페이스 입니다. 이 기법의 장점은 Marker Interface로서 단순히 implement하는 것만으로도 JVM에게 직렬화가 가능하다는 것을 알려주기 때문에 구현이 간편하다는점이 있습니다. 자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야기합니다.
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'를 이용하여 해당 클래스로 캐스팅 해야합니다.
위 코드처럼 일반 class 형태에서 Serializable만 구현하면 됩니다. 하지만 단점으로는 Parcelable보다 속도가 느립니다. 왜냐하면 Serializable은 reflection이라는 기술을 사용기 때문입니다. 프로그램 런타임에 데이터를 직렬화/역직렬화하는 과정에 많은 객체를 생성하고 덕분에 GC가 할일이 늘어나게 됩니다. 그래서 CPU에 부하가 갑니다. 프로젝트의 사이즈가 커져서 Serializable을 사용하는 객체가 많아지면 많아질수록 성능에는 안좋은 영향을 미치게 됩니다.