얼마전 제 개인 프로젝트의 target SDK를 33으로 올렸더니 deprecated된 메소드를 경험하여서 이를 공유하려고 합니다.
그리고 이와 함께 데이터 직렬화와 역직렬화에 대해서도 몇가지 서술해 보곘습니다!
저는 Activity에서 WebView로 이동할때 intent에게 모델을 넘겨주었습니다.
그리고 받는쪽에서 사용한 메소드는 getPacelable<클래스>(키값) 입니다.
targetSDK를 올리고 혹시나 싶어 여러 클래스 들을 확인해본 결과, 역시 deprecated 된 메소드를 하나 발견 했습니다.
위 메소드의 설명은 아래와 같습니다.
위 메소드에 관한 문제 원인은 아래와 같습니다.
1. Android가 제공하는 클래스가 아닌 경우 ClassLoader로 setClassLoader를 호출 해야한다.
(Class Loader: JVM의 abstract class 로써 Byte code를 읽어 들여서 새로운 class를 생성하는 역할)
2. 그렇지 않으면 throw 하거나 null을 리턴 할 수도 있다.
이 deprecated 된 이유를 보자마자 바로 떠오른 해결방안이 있었습니다.
바로 kotlin의 reified 키워드 인데요.
제네릭은 보통 runtime 에서 class를 알 수 있습니다. 하지만 reified 키워드를 사용하면 다른데요.
runtime이 아닌 compile time에 해당 키워드를 통해 class를 알수 있으면 어떨까 하며 코드를 작성해 보았습니다.
우선 Android가 deprecated 된 메소드를 보완하여 만든 새로운 메소드는 아래와 같습니다.
변경된 점은 제네릭으로 받는게 아니라 파라미터로 받고 있네요.
그럼 이렇게 작성해 보겠습니다.
inline fun <reified T: Parcelable> Intent.getParcelableValue(key: String): T? {
return when {
Build.VERSION.SDK_INT >= 33 -> getParcelableExtra(key, T::class.java)
else -> @Suppress("DEPRECATION") getParcelableExtra(key) as? T
}
}
inline fun <reified T: Parcelable> Bundle.getParcelableValue(key: String): T? {
return when {
Build.VERSION.SDK_INT >= 33 -> getParcelable(key, T::class.java)
else -> @Suppress("DEPRECATION") getParcelable(key) as? T
}
}
여러 레퍼런스를 찾아봐도 다른 개발자 분들도 저와 같은 생각을 한 것 같습니다.
더 나은 해결책이 있다면,, 공유 부탁드립니다!!
그럼 데이터 직렬화와 역직렬화는 무엇일까요?
데이터 타입은 크게 두가지로 나뉘어 집니다.
1. 원시 타입 : Int, Character, Boolean 등등,,
2. 참조 타입 : C++의 포인터나, 클래스들,,
원시타입은 메모리 구조상 stack 영역에 쌓이게 되고 직접 접근이 가능합니다.
하지만 참조 타입은 Heap 영역 할당이 되고 stack 영역에 접근 하여 참조중인 주소를 통해 접근하게 됩니다.
값을 주고 받거나 할때 원시 타입은 stack에 접근하여 데이터 처리가 가능한데 참조타입은 불가능합니다.
그래서 이를 해결한게 데이터 직렬화 입니다.
즉, 데이터 직렬화는 stack 영역에서 heap 영역을 참조하는 것들을 원시 타입 처럼 데이터로 변환 하는 작업을 말합니다.
android에서는 이를 두가지 방법으로 해결할 수 있습니다.
Java가 제공하는 Serialiable을 사용하거나 android가 제공하는 Parcelize를 사용하는 것입니다.
이 둘의 차이를 쓰자면 너무 내용이 길어 질 것 같아서 좋은 글을 찾아 밑에 참조 해놓겠습니다.
(찰스님의 블로그 : https://www.charlezz.com/?p=823)
Parcelable과 Serializable 비교 | 찰스의 안드로이드
Serializable은 분명히 개발자 입장에서는 편합니다. 인터페이스 구현만 하면되니까요. 하지만 앱 사용자에게는 퍼포먼스저하와 베터리 드래인이라는 큰 단점을 안겨 줍니다. 조금은 귀찮더라도 Se
www.charlezz.com
getParcelableExtra가 deprecated 되었으니 간략하게 적자면 @Parcelize 어노테이션과, Parcelable 인터페이스 와 함께 데이터를 직렬화 할 수 있는 것입니다.
그럼 데이터 역직렬화란 무엇일까요.
위에서 데이터 직렬화란 참조타입을 원시타입으로 변환 하는 것이라고 말씀 드렸습니다.
역직렬화란 데이터 직렬화의 반대 과정을 거치는 것 입니다.
원시 타입을 다시 객체를 참조 할 수 있도록 하는 것이죠.
그래서 사용하는것이 getParcelable 메소드 입니다.