NOW OR NEVER

[Android] 직렬화 Serialization 본문

Android

[Android] 직렬화 Serialization

LAURA 2024. 1. 16. 19:53
반응형

직렬화 Serialization

  • 객체를 Byte Stream으로 변환하는 프로세스를 의미
  • 변환된 데이터는 파일에 저장하거나 네트워크를 통해 전송 가능
  • 직렬화를 통해 객체를 전송하거나 저장할 때 유용하게 사용 가능
  • 역직렬화는 반대로 바이트 스트림을 다시 객체로 변환하는 프로세스이다.

Bite Stream

  • 바이트 단위로 전송하는 입출력 스트림
  • 특정 문자 인코딩과 무관하게 데이터를 전송 가능하여 텍스트 파일, 바이너리 파일 등 여러 종류의 파일을 처리하는 데에 유용
  • 자바에서의 바이트 스트림을 다루기 위한 기본 클래스 : InputStream, OutputStream

객체를 직렬화 하기 위한 Interface

  • Parcelable와 Serializable를 동시에 사용 불가능: 클래스가 Parcelable로 구현되면 Serializable을 함께 사용할 수 없다. Parcelable로 충분하다면 Parcelable를 사용하는 것이 좋다.

Serializable

  • java.io.Serializable
  • 객체 자체를 전달할 때는 Serializable을 사용해도 되지만 객체 리스트를 지원하지 않기 때문에 객체 리스트 전달 시 Parcelable을 사용해야 한다.
  • Reflection 사용: 객체를 직렬화하고 역직렬화할 때 리플렉션(reflection)을 사용하므로 런타임 시 성능이 일부 영향을 받을 수 있다.
    • Reflection : 자신의 구조를 동적으로 조사하고 수정할 수 있는 메서드의 종합체 (생성자, get, set 메서드 등으로 이루어져 있다.)
      • 클래스의 정보 얻기: 클래스의 이름, 메서드, 필드, 생성자 등의 정보를 얻기 가능
      • 인스턴스 생성 및 메서드 호출: 클래스의 인스턴스를 동적으로 생성하거나 메서드를 호출 가능
      • 필드 값 읽기 및 쓰기: 클래스의 필드에 저장된 값을 읽거나 수정 가능
      • 어노테이션 처리: 클래스, 메서드, 필드 등에 부여된 어노테이션을 읽고 처리
  • @Serializable 사용 시 자동으로 관련 메서드를 implementaion 할 수 있다. 
  • @Serializable data class Person( val name: String, val age: Int, ) : Serializable

 

Parcelable

  • Parcel : 안드로이드에서 객체를 직렬화하고 전달하는 데 사용되는 클래스
  • 안드로이드에서는 Parcelable을 선호하고 성능상의 이점이 있다
  • 객체가 자주 전달되는 경우 Parcelable을 사용
  • 직렬화 및 역직렬화를 위해 Reflection이 아닌 명시적인(추상화 하지 않은) 코드를 사용하기 때문에 성능이 향상
  • @Parcelable 사용 시 자동으로 관련 메서드를 implementaion 할 수 있다. (writeToParcel(), createFromParcel())
    • writeToParcel() : 객체를 Parcel에 쓰는 역할. 해당 메서드를 통해 객체의 필드들을 Parcel에 저장
    • createFromParcel() : Parcel에서 객체를 생성하는 역할 
    • @Parcelable data class Person( val name: String, val age: Int, ) : Parcelable
Comments