提到序列化蝴乔,很多選手腦袋冒出的第一個聲音 —— “Parcelable和Serializable”糊饱。
其實Android項目中可以使用的序列化方式不止這兩個,有一些你可能正在用,但是并不知道這種方式屬于序列化耐齐。
一、什么是序列化
在日常生活中“序列化”并不是一個常見的詞匯。對于這種看上去高大上的詞語如果不能了解透徹埠况,很容易成為你研究新神通的阻礙耸携。知其然并知其所以然,才能一通百通辕翰,不讓代碼限制你的跳躍性思維夺衍。
1.定義:
百度百科:
序列化 (Serialization) 將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。在序列化期間喜命,對象將其當(dāng)前狀態(tài)寫入到臨時或持久性存儲區(qū)沟沙。以后,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài)壁榕,重新創(chuàng)建該對象矛紫。
維基百科:
序列化(serialization)在計算機科學(xué)的數(shù)據(jù)處理中,是指將數(shù)據(jù)結(jié)構(gòu)或?qū)ο鬆顟B(tài)轉(zhuǎn)換成可取用格式(例如存成文件牌里,存于緩沖含衔,或經(jīng)由網(wǎng)絡(luò)中發(fā)送),以留待后續(xù)在相同或另一臺計算機環(huán)境中二庵,能恢撤消先狀態(tài)的過程贪染。
與序列化相反的過程又稱為反序列化。
2.理解:
通俗的講:
序列化就是你朋友把電腦拆了催享,你把拆了的電腦組裝起來就是反序列化杭隙。而拆了的電腦可以扔到倉庫儲存,或者快遞郵寄傳輸因妙。
玄學(xué)著講:
序列化就是把有形化為無形痰憎,從無形化為有形恢復(fù)本來面目就是反序列化廉邑。無形不滅熬甫。
序列化是一個有規(guī)則的變化過程滤愕,反序列化則是有同樣但是相反的規(guī)則的變化過程睦霎。
3.圖解
二乏梁、序列化的目的
了解一個技術(shù)設(shè)計出來的目的逮栅,能幫你在需要的時候做出更好的選擇拐迁。比如當(dāng)你選擇用NestedScrollView還是ScrollView的時候官地,如果你知道NestedScrollView出現(xiàn)的目的是跟MD中的其他控件兼容怒详,那在里面嵌套RecycleView的時候你就應(yīng)該毫不猶豫的選擇NestedScrollView炉媒。
- 以某種存儲形式使自定義對象持久化;
- 將對象從一個地方傳遞到另一個地方昆烁。
- 使程序更具維護(hù)性吊骤。
通俗點講:
一些情況下,對象是不能直接傳輸?shù)木材幔枰蛄谢追邸=邮辗椒葱蛄谢玫皆瓕ο蟆?br> 一些情況下传泊,電腦是不方便直接郵寄的,需要拆了分開郵寄鸭巴。收件人重新組裝得到原電腦眷细。
三、序列化的用途
用途的介紹是不可能介紹全的奕扣,了解了定義和目的薪鹦,用在什么地方全憑你的喜好。就好像你知道了郵寄電腦可以把它拆了惯豆,你就應(yīng)該知道網(wǎng)購自行車也可以買被拆散的那種池磁。這也就是我前文中提到的“新神通”。
- 經(jīng)由電信線路傳輸數(shù)據(jù)的方法(通信)楷兽。
- 遠(yuǎn)程程序調(diào)用的方法地熄,例如在SOAP中。
- 檢測隨時間數(shù)據(jù)變動的方法芯杀。
- 存儲數(shù)據(jù)的方法(在數(shù)據(jù)庫或硬盤)端考。
- 從服務(wù)器獲取數(shù)據(jù)。
- Activity之間傳遞數(shù)據(jù)揭厚。
等等...
思維再發(fā)散一點却特,你能想到更多,下面是維基百科中的例子:
商用軟件的出版商通常會將應(yīng)用軟件的序列化格式筛圆,當(dāng)作商業(yè)秘密裂明,以阻礙競爭對手生產(chǎn)可兼容的產(chǎn)品;有些會蓄意地混淆太援,或甚至將序列化數(shù)據(jù)作加密處理闽晦。
四、序列化格式
序列化需要規(guī)則提岔,如果你不知道序列化的規(guī)則仙蛉,也就不能反序列化。傳遞過來的序列化便沒有意義了碱蒙。到這里你也能知道序列化和加密的區(qū)別了荠瘪,加密是不一定需要解密的。
序列化格式多種多樣振亮,甚至可以自定義巧还。然而,互通可用性的要求應(yīng)用程序能夠理解彼此的序列化格式坊秸。
維基百科中有如下介紹:
20世紀(jì)80年代初的施樂網(wǎng)絡(luò)系統(tǒng)快遞技術(shù)影響了第一個廣泛采用的標(biāo)準(zhǔn)。Sun Microsystems在1987年發(fā)布了外部數(shù)據(jù)表示法(XDR)澎怒。90年代后期開始推動標(biāo)準(zhǔn)序列化的協(xié)議:XML(可擴展標(biāo)記語言)應(yīng)用于產(chǎn)生人類可讀的文字編碼褒搔。數(shù)據(jù)以這樣的編碼使存續(xù)的對象能有效用阶牍,無論相對于人是否可閱讀與理解,或與編程語言無關(guān)地傳遞給其它信息系統(tǒng)星瘾。它缺點是失去了扎實的編碼字節(jié)流走孽,但截至當(dāng)前技術(shù)上所提供大量的存儲和傳輸容量,使得文件大小的考量琳状,已不同于早期計算機科學(xué)的重視程度磕瓷。二進(jìn)制XML被提議作為一種妥協(xié)方式,它不能被純文本編輯器讀取念逞,但比一般XML更為扎實困食。在二十一世紀(jì)的Ajax技術(shù)網(wǎng)頁中,XML經(jīng)常應(yīng)用于結(jié)構(gòu)化數(shù)據(jù)在客端和伺服端之間的異步傳輸翎承。相較于XML硕盹,JSON是一種輕量級的純文字替代,也常用于網(wǎng)頁應(yīng)用中的客端-伺服端通信叨咖。JSON肇基于JavaScript語法所派生瘩例,但也廣為其它編程語言所支持。與JSON類似的另一個替代方案是YAML甸各,它包含加強序列化的功能垛贤,更“人性化”而且更扎實。這些功能包括標(biāo)記數(shù)據(jù)類型趣倾,支持非層次結(jié)構(gòu)式數(shù)據(jù)結(jié)構(gòu)聘惦,縮進(jìn)結(jié)構(gòu)化數(shù)據(jù)的選項以及多種形式的標(biāo)量數(shù)據(jù)引用的概念。
五誊酌、Android項目中可以使用的序列化方式不止Parcelable和Serializable
呼應(yīng)標(biāo)題部凑,現(xiàn)在你應(yīng)該知道為什么不止兩種方式了。序列化是一種技術(shù)碧浊,不僅僅一兩種方法涂邀。只要滿足定義,都可以被稱之為序列化箱锐。然后你便能想到:
- json也是一種序列化比勉。網(wǎng)絡(luò)請求用到那么多。
- 遠(yuǎn)古時代的xml也是序列化驹止。記不記得曾經(jīng)很火的博客主題“Android XML解析”浩聋?
等等...
六、排查項目
了解了序列化的定義臊恋、目的衣洁,反觀我們自己的項目。
- 有些bean類又實現(xiàn)了Serializable抖仅,又用json解析構(gòu)建坊夫,真的有必要嗎砖第?
- 不同平臺之間json傳遞數(shù)據(jù),需要考慮平臺特性嗎环凿?
- Activity之間傳遞對象只能用Serializable嗎梧兼?json行不行?
等等...
最后智听,希望這篇文章能幫助各位選手在日常工作中和新神通的研發(fā)中能更合理更擅長的使用序列化和反序列化羽杰。
如果文章中您發(fā)現(xiàn)了什么錯誤,有什么補充到推,歡迎留言探討考赛。朋友的QQ群:511276976
還有,打兩個廣告环肘,自己的項目:
1欲虚、【拇指先生】https://github.com/Reone/Mrthumb 關(guān)于視頻縮略圖
2、【KVStorage】https://github.com/Reone/KVStorage 關(guān)于key-value形式使用數(shù)據(jù)庫