본문 바로가기

Android

kotlinx.serialization 라이브러리 소개

개요

이 문서는 Kotlin에서 데이터 Serialization(직렬화) 시 사용하는 kotlinx.serialization 라이브러리에 대해 소개합니다.

 

Serialization(직렬화)은 프로그램에서 사용하는 데이터 객체를 특정 포맷의 문자열로 변환하는 프로세스이고,
Deserialization(역직렬화)은 외부 소스에서 받은 문자열을 데이터 객채로 변환하는 프로세스입니다.

 

일반적으로 API 호출 시 Json 포맷의 response를 Deserialization(역직렬화)하는 데 사용합니다.

 

kotlinx.serialization 라이브러리의 특징

  • 순수 Kotlin 언어로 작성
  • 다양한 포맷 지원(JSON, Protobuf, CBOR, Hocon, Properties)
  • Kotlin Multiplatform 환경 지원
  • Kotlin을 개발한 JetBrains의 공식 라이브러리

프로젝트에 설정하는 방법

https://github.com/Kotlin/kotlinx.serialization#setup

사용하는 방법

1. 직렬화 시 사용하는 데이터 class에 @Serializable 어노테이션을 추가합니다.

@Serializable
data class Person(
    var id: Int,
    var name: String,
    var age: Int
)

 

2. Json.encodeToString()를 호출하여 데이터 instance를 serialize(직렬화)합니다.

val json = Json.encodeToString(Person(0, "Harry", 30))
println(json)
// {"id":0,"name":"Harry","age":30}

 

3. decodeFromString()를 호출하여 Json 포맷의 문자열을 deserialize(역직렬화)합니다.

val obj = Json.decodeFromString<Person>("""{"id":0,"name":"Harry","age":30}""")
println(obj)
// Person(id=0, name=Harry, age=30)

 

특징

  1. @Serializable 어노테이션을 사용하는 이유 :
    기존에 직렬화 시 사용하던 Gson 라이브러리는 reflection 방식을 사용하여 runtime에 객체를 변환하기에 해당 클래스에 어노테이션을 선언하지 않아도 동작했습니다. 하지만 Kotlin Serialization은 reflection 방식을 사용하지 않기에 @Serializable 어노테이션을 통해 Kotlin Serialization plugin에 직렬화 시 해당 클래스를 생성하고 연결하도록 지시합니다.
  2. 다양한 통신 라이브러리에서 사용 가능
    Retrofit 2에서 컨버터로 지정하는 방법

    Ktro에서 Serialization로 지정하는 방법

참고

https://kotlinlang.org/docs/serialization.html
https://github.com/Kotlin/kotlinx.serialization