
當(dāng)你還在?Gson時(shí),Square那幫?已經(jīng)開發(fā)出了Moshi了!!
:
好久不見,曾經(jīng)我們相處得很好,但是是時(shí)候說再見了。
在你的朋友圈中也許會(huì)聽到這樣的語句(也可能沒有),但這并?是本篇?章的主題,我們要談?wù)摰氖?個(gè)新的關(guān)于 Android 和 kotlin 序列
化框架!我們需要將 Gson 遷移到 Moshi上?了。
當(dāng)我們談?wù)摓樯禡oshi是更優(yōu)秀的框架,或者怎么遷移到 Moshi之前,我們先來了解?下今天的 Gson 的發(fā)展。
Gson,what?
當(dāng)我們查看 Gson 的倉庫時(shí),它是這么描述的:
?個(gè)Java 的序列化/反序列化框架,?來將Java對象轉(zhuǎn)換成Json對象,或者反之。
那么它有以下缺點(diǎn):
很顯然它對kotlin并不友好,當(dāng)然也不是kotlin寫的( Gson 是純Java實(shí)現(xiàn)的),所以每個(gè)?都可以清楚的意識到 Gson 已經(jīng)不再是?個(gè)
現(xiàn)代的開發(fā)框架了。它發(fā)布于2008年,距離今天已經(jīng)12年了,看上去已經(jīng)不更新了(這個(gè)的確,看了?下最新的?次更新時(shí)間是9個(gè)?
錢了),完完全全是?個(gè)將死的項(xiàng)?了。
最近沒有更新,上?次更新看上去并沒有?的更新或者問題修復(fù)(意思就是?修?補(bǔ)),事實(shí)上不去碰那些運(yùn)?得很好的程序,破壞數(shù)百
萬使?Gson庫的app 是有道理的(個(gè)?認(rèn)為這?還是正?夸贊了Gson的流?和穩(wěn)定),但是對于Gson這個(gè)項(xiàng)?來說,它似乎正在死
去。
Gson 庫的?法數(shù)?概為1036個(gè),?概是 Moshi 庫中?法數(shù)的兩倍(Moshi中?法數(shù)?概為500)。
庫的體積 使? Gson ?約使你的app增?了300kb,?Moshi?概有120kb。
Gson 使?了 Java的反射實(shí)現(xiàn)了序列化和反序列,? Moshi 使?了 Kotlin 代碼?動(dòng)?持。
Gson不?持對象屬性有默認(rèn)值。如果在Gson字符串中缺少了屬性對應(yīng)的字符串,即使你設(shè)置了默認(rèn)值,它將來還是null值(這個(gè)不是特
別明?啥意思)。
假設(shè)我們認(rèn)為 Gson 將死,那我們將?向何??當(dāng)然我們可以繼續(xù)使? Gson,因?yàn)樗?直都正常?作!但是對于那些好奇?很強(qiáng)的開發(fā)者
和kotlin愛好者來說,我們還有 Moshi。接下來我們來看看 什么是 Moshi 和 為什么是 Moshi了。
什么是 Moshi ?
?個(gè) 現(xiàn)代的 kotlin 和 Java Json解析庫
(也是?名??的square公司出品的)。主要特點(diǎn)是 現(xiàn)代的、kotlin友好的、更快的、擁有?量可靠的功能。先來看看這些?叉的功能吧:
更好的 API
Moshi提供了更好更現(xiàn)代的 API,你可以使?此強(qiáng)?功能的 API 進(jìn)?簡單整潔的操作。
在 Moshi中 注解(Annotation) 被視為最重要的部分,注解可以允許你添加?些信息來更加細(xì)粒度的實(shí)現(xiàn)上下?序列化。
你可以?定義注解來解析你的Json數(shù)據(jù)屬性,(就像解析顏?使?@ColorInt, @FromHexColor?樣)
?定義適配器或者上下?反序列可以使功能更加整潔,從?減少樣板代碼。
Moshi 擁有更好的、更具?性化的獲取序列化失敗信息的能?。在當(dāng)你的app發(fā)布之后,從奇怪的堆棧信息中不知道應(yīng)該做什么,那么
Moshi將會(huì)是?個(gè)巨?的進(jìn)步(可以幫助你獲取異常信息)。
Moshi 擁有 newBuilder() ?法從上游的Adapter中來幫助創(chuàng)建新的Adapter,這就有點(diǎn)像OkHttp 或者 Okio builder模式了,它超級
有?,因?yàn)槟憧梢詣?chuàng)建獨(dú)?的Adapter,這樣就不需要擁有解析全部對象的Adapter(這句話的意思,需要理解Moshi解析字符流的?式
和Gson不?致,Gson是從前到后,?個(gè)字符不落下去解析,?Moshi可以直接跳過?標(biāo)字符,只需要得到??想要的字符)
Moshi ?持多態(tài)數(shù)據(jù)類型,同時(shí)也?持未知的數(shù)據(jù)類型的回退。
Moshi在 Kotlin 中擁有代碼?動(dòng)?成功能,這個(gè)很好!在注解的幫助下,你可以更加快速的序列化反序列化.這個(gè)?Gson使?反射?
法快多了。
Moshi 的表現(xiàn)
Moshi ? Gson 要快(通過實(shí)驗(yàn)得出結(jié)論), ?且Moshi消耗的內(nèi)存更少,這是因?yàn)樗?了 Okio,Okio可以在解析Json字符流的過程提前
預(yù)測或者期望忽略掉未知的、不需要的字段(從?達(dá)到速度快、內(nèi)存?的?的, ). Retrofit底層也是?了 Okio,所以你才會(huì)發(fā)?什么?
Json序列化庫(Moshi) 和 ?絡(luò)請求?具(Retrofit) 可以共?它們的緩沖區(qū),這樣將會(huì)在?絡(luò)請求和序列化時(shí)降低內(nèi)存的消耗。
理論說的差不多了,看看代碼咋寫吧
來看看咋樣?步?步從Gson遷移到 Moshi 吧。
1. 添加 依賴
/*Moshi*/
def moshiVersion = "1.10.0"
implementation(":moshi:$moshiVersion")
kapt(":moshi-kotlin-codegen:$moshiVersion")
implementation("it2:converter-moshi:2.9.0")
2. 將所有的 @SerializedName 替換成 @Json
data class MediaCandidateData(
@SerializedName("width")
val width: Int,
@SerializedName("height")
val height: Int,
@SerializedName("url")
val url: String
)
替換為:
data class MediaCandidateData(
@Json(name = "width")
val width: Int,
@Json(name = "height")
val height: Int,
@Json(name = "url")
val url: String
)
3. 給所有的Data Class 添加 @JsonClass(generateAdapter = true) 注解
給所有的Data Class 添加 @JsonClass(generateAdapter = true)注解,將會(huì)參與到序列化反序列化的進(jìn)程中。它幫助Moshi使?代碼
?動(dòng)?成??使?將會(huì)降低速度的反射。
@JsonClass(generateAdapter = true)
data class MediaCandidateData(
@Json(name = "width")
val width: Int,
@Json(name = "height")
val height: Int,
@Json(name = "url")
val url: String
)
4. 替換Gson的實(shí)例為 Moshi
如果使? Dagger 來提供依賴,你可以需要這么?:
@Singleton
@Provides
fun provideGson() = GsonBuilder().tLenient().create()
替換為:
@Singleton
@Provides
fun providesMoshi() = Moshi.Builder().build()
5. 使? Retrofit時(shí)替換 converter
當(dāng)你使?Retrofit 和 Dagger 時(shí),你可能需要這么做:
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient, gson: Gson) = Retrofit.Builder()
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.baUrl(BASE_ENDPOINT)
.build()
現(xiàn)在替換為:
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient, mosh: Moshi) = Retrofit.Builder()
.client(okHttpClient)
.addConverterFactory(MoshiConverterFactory.create(mosh))
.baUrl(BASE_ENDPOINT)
.build()
就是這么簡單,從Gson遷移到 Moshi?常簡單。
當(dāng)然也有些特例需要單獨(dú)講明,這可能需要下篇?章說明了。

本文發(fā)布于:2023-05-21 15:22:33,感謝您對本站的認(rèn)可!
本文鏈接:http://m.newhan.cn/zhishi/a/1684653754171727.html
版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。
本文word下載地址:當(dāng)你還在用Gson時(shí),Square那幫人已經(jīng)開發(fā)出了Moshi了!!.doc
本文 PDF 下載地址:當(dāng)你還在用Gson時(shí),Square那幫人已經(jīng)開發(fā)出了Moshi了!!.pdf
| 留言與評論(共有 0 條評論) |