โจ ์ค๋ ๊ณต๋ถํ ๊ฒ
- ์ฌํ ์ฃผ์ฐจ ๊ฐ์ธ ๊ณผ์
- ์๋ จ ์ฃผ์ฐจ ํน๊ฐ ๋ณต์ต
๋ฌธ์ ์ํฉ
๋ณด๊ดํจ์ ์ ์ฅํ ๋ฆฌ์คํธ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ Shared Preference๋ก ์ ์ฅ์ ํ์๋ค. ์๋๋ ์ ๋์์ง๋ง ๊ฐ์ฒด๋ฅผ sealed class๋ก ๋ฐ๊พธ์ ๋ง์ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
val listType = object : TypeToken<MutableList<ListItem>>() {}.type
// ์ด ์ค์์ json์ผ๋ก ๋ณํํ๋ ๋์ค ์๋ฌ ๋ฐ์..
return gson.fromJson(jsonString, listType)
com.google.gson.JsonIOException: Abstract classes can't be instantiated! Register an InstanceCreator or a TypeAdapter for this type.
์ด ํ์ ์ ๋ํด TypeAdapter๋ฅผ ์ง์ ํด๋ฌ๋ผ๋ ๋ป.. ๊ฐ๋ค. ๊ทธ๋์ ์ฐพ์๋ณด๋ CustomDeserializer๋ฅผ ์ฌ์ฉํ๋ฉด ํด๊ฒฐ๋๋ค๊ณ ํ๋ค.
ํด๊ฒฐ
ํ์ ์ด ๋ค ๋ฌธ์์ด์ด์ฌ์ ๊ตฌํํ๋๋ฐ์๋ ์ด๋ ค์ด ์ ์ ์์๋ค. ๋ค์๊ณผ ๊ฐ์ด ํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ,
class CustomerDeserializer : JsonDeserializer<ListItem> {
override fun deserialize(
json: JsonElement,
typeOfT: Type?,
context: JsonDeserializationContext?
): ListItem {
val jsonObject = json.asJsonObject
return if (jsonObject.has("thumbnail")) ListItem.VideoItem(
thumbnail = jsonObject.get("thumbnail").asString,
title = jsonObject.get("title").asString,
datetime = jsonObject.get("datetime").asString,
isBookmarked = jsonObject.get("isBookmarked").asBoolean
)
else ListItem.ImageItem(
thumbnailUrl = jsonObject.get("thumbnailUrl").asString,
siteName = jsonObject.get("siteName").asString,
datetime = jsonObject.get("datetime").asString,
isBookmarked = jsonObject.get("isBookmarked").asBoolean
)
}
}
GsonBuilder()
๋ฅผ ์ฌ์ฉํด ์ ์ฉํด์ค ์ ์๋ค.
private val gson =
GsonBuilder().registerTypeAdapter(ListItem::class.java, CustomerDeserializer()).create()