안드로이드 Serializable

HEETAE HEO·2022년 6월 20일
0
post-thumbnail

Serializable

Serializable은 자바 직렬화 인터페이스 중 하나입니다. 객체를 바이트 스트림으로 변환하여 네트워크 전송 또는 파일 저장 등에 사용할 수 있습니다.

Serializable을 구현하기 위해서는 해당 클래스에서 Serializable 인터페이스를 구현하면 됩니다. 이 때, 해당 클래스 내의 필드들도 모두 Serializable을 구현해야 합니다.

직렬화?
메모리 상 정보를 Byte 단위의 코드를 통해 직렬로 나열하는 것

장점

  • Serializable 인터페이스를 구현하면 객체를 직렬화하여 파일이나 네트워크로 전송할 수 있습니다.
  • 객체를 직렬화하여 전송하면 객체를 받는 쪽에서 역직렬화하여 객체를 복원할 수 있습니다.

단점

  • Serializable을 구현하면 객체를 직렬화하는 과정에서 자바 직렬화(Reflection) 알고리즘을 사용합니다. 이 알고리즘은 직렬화된 객체의 크기가 크며, 직렬화/역직렬화 과정에서 CPU 자원과 메모리 자원을 많이 사용합니다.

  • 직렬화된 데이터의 구조가 복잡하면 역직렬화 과정에서 예외가 발생할 수 있습니다.

  • Serializable을 사용하면 클래스 버전 관리에 대한 문제가 발생할 수 있습니다. 예를 들어, 객체를 직렬화 하여 전송한 후에 클래스를 변경하면 역직렬화 과정에서 예외가 발생할 수 있습니다.

Reflection은 자바에서 기본적으로 제공하는 API입니다.
생성되어 있는 객체를 통해 해당 객체의 클래스 정보를 분석해내는 기법을 뜻합니다.(클래스 명, 접근 지정자, 패키지 정보, 슈퍼 클래스, 구현한 인터페이스, 생성자, 메소드, 필드, 어노테이션 등의 정보 활용)
Reflection은 사용 당시 객체의 구체적인 클래스 형태를 모를 때 사용하게 됩니다.

그렇기에 프로그램 런타임에 데이터를 직렬화/역직렬화하는 과정에 많은 객체를 생성하고 덕분에 GC가 할일이 늘어나게 됩니다. 그래서 CPU의 부하가 갑니다. 프로젝트의 사이즈가 커져서 Serializable을 사용하는 객체가 많아지면 많아질수록 성능에는 안좋은 영향을 미치게 됩니다.

코드 예시

  1. ImageData.kt
data class ImageData(
    val csTitle : String,
    val csContentTitle : String,
) : Serialiable
  1. MainActivity.kt
class SendActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val data = ImageData("음식","분식")
        val intent = Intent(this,subActivity::class.java)
        intent.putExtra("key",data)
        startActivity(intent);
    }
}
  1. SubActivity.kt
class SubActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sub)

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

마치며

Serializable 인터페이스는 자바에서 오래전부터 사용되어왔지만, 안드로이드에서는 Parcelable 인터페이스를 권장합니다. Parcelable은 Serializable보다 직렬화/역직렬화 속도가 빠르며, 안드로이드에서 더욱 최적화된 직렬화 방법을 사용합니다. 따라서, Parcelable을 사용할 수 있다면 Serializable보다 더욱 좋은 선택입니다.

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글