티스토리 뷰
Serialization 이란?
- 데이터 구조나 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정.
자바에서 정의하는 Serialization 이란 ?
- 자바 언어에서 사용되는 Object 또는 Data를 다른 컴퓨터의 자바 시스템에서도 사용 할 수 있도록 바이트 스트림 형태로 변환하는 포맷 변환 기술을 말한다.
- 반대 개념인 역직렬화(Deserialization)는 바이트 스트림으로 변환된 데이터를 자바 시스템의 Object 또는 Data로 변환하는 기술이다.
너무 깊이 가지 말고 간단하게 정리하자면...
Android 에서는 컴포넌트간의 Bundle을 통한 데이터 전달이나 서버통신을 할 때 필수적으로 하는 것이 데이터의 직렬화/역직렬화다.
보통 Java Interface인 Serializable과 Android SDK Interface인 Parcelable을 비교하게 되는데 다음과 같은 내용을 많이 찾아 볼 수 있다.
- Serializable : 사용 시 Reflection 발생에 따라 많은 객체가 생성되고 해제되면서 GC가 발생하고 많은 비용이 발생하게 된다.
- Parcelable : 내부에 Boiler plate code가 생성되기 때문에 유지보수에 비용이 든다. 성능면에서는 Serializable 보다 좋다.
문제점으로는 서버에서 응답 값을 받아 올 때 data class로 받게 되는데 위의 두가지를 사용하면 값이 없을 경우 default value를 무시하고 0 or null 값으로 직렬화되는 것을 볼 수 있다.
이런 경우에 Kotlin project를 위한 JSON serialization인 Kotlinx Serialization 을 사용하게 되면 위의 문제점을 해결 할 수 있다.
다음과 같이 Serializable 어노테이션을 달아주면 쉽게 사용할 수 있다.
@Serializable data class Data(val a: Int, val b: String) |
Gson 과 Json 을 통해 json 텍스트를 각각 클래스로 변환하면 다음과 같다.
enum class Status { SUPPORTED }
@Serializable
data class JsonData(
val a: Int,
val b: String,
val c: Status = Status.SUPPORTED
)
data class GsonData(
val a: Int,
val b: String,
val c: Status = Status.SUPPORTED
)
fun main() {
val jsonText: String = ... /* json string from assets/xxx.json */
val gsonData = Gson().fromJson<GsonData>(jsonText, object : TypeToken<GsonData>() {}.type)
val jsonData = Json.decodeFromString<JsonData>(jsonText)
...
}
다음과 같은 결과를 볼 수 있다.
@Serializable 어노테이션을 통해 Json으로 파싱하게 되면 다음과 같이 default value가 들어가게 되고
{"a":1,"b":"test","c":":"SUPPORTED"}
@Serializable 어노테이션이 없는 data class로 Gson으로 파싱하게 되면 다음과 같이 null 이 들어가는 것을 볼 수 있다.
{"a":1,"b":"test","c":":null}
장점은 다음과 같다.
- @Serializable 을 빼놓을 경우 컴파일 에러가 발생한다.
- default value가 적용되어 파싱 에러에 대한 처리가 줄고 사용성이 좋아진다.
- Reflection을 사용하지 않고 구현되었다.
'android' 카테고리의 다른 글
[ JitPack ] Jitpack을 이용하여 Open Source Library 배포 (0) | 2020.02.20 |
---|---|
[ Android / RecyclerView ] #4 아이템 확장 / 축소 구현 (0) | 2020.02.05 |
[ Android / RecyclerView ] #3 Header / Footer Item 구현 (1) | 2020.02.05 |
[Android / RecyclerView] #2 밀어서 아이템 삭제 구현 (0) | 2020.02.05 |
[Android / Recycler View] #1 기본 타입 구현 (0) | 2020.02.05 |
- Total
- Today
- Yesterday
- type inference
- kotlin
- Parcelable
- git server
- weak_ptr
- qtwebengine
- android serialization
- 오픈 소스 배포
- RecyclerView
- expandable recyclerview
- data transfer
- serializable
- ubuntu 16.04
- auto depoly
- kotlinx serialization
- swip
- security.ubuntu.com
- Git
- Jenkins
- build server
- 자동 배포
- publish opensource
- jitpack
- android open source
- delete item
- remove item
- git hook
- Apache
- 리사이클러뷰 확장
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |