使用LitJson进行序列化和反序列化
這是第31篇與游戲開發有關的文章。
?
| 寫在最前
最近在寫小玩具的時候,遇到了需要將游戲記錄到本地、并從本地讀取的情況,如:保存游戲戰斗錄像或是存儲、讀取游戲存檔。有多種方法可以實現這個需求,在這里我使用的是序列化成Json的方法;因為它夠簡單,結構清晰且可讀性強,很方便我們對保存的內容進行直觀查看。
| 關于LitJson
Json的書寫格式就不再介紹了,網絡上也有很多二手手游賬號交易第三方庫可以幫助我們快速生成和解析Json文件,在此我使用的是LitJson,它比較常用,而且十分易用。
LitJson使用簡單,通常我們直接使用JsonMapper就可以進行Json的序列化和反序列化了。
但是本文記錄的是使用JsonWriter和JsonReader進行序列化和反序列化的過程。
之所以沒有使用更簡單易用的JsonMapper,而使用LitJson中偏基礎些的Reader和Writer,主要是因為:
1、對于一些需要二次處理的內容,JsonWriter和JsonReader用起來更靈活些;
2、洋氣。
| 關于JsonWriter和JsonReader
· JsonWriter
JsonWriter像是模仿手寫Json,通過WriteArrayStart、WriteArrayEnd和WriteObjectStart、WriteObjectEnd來控制當前所寫的是數組或是對象;再通過WritePropertyName和Write來寫鍵值對,非常容易理解。
· JsonReader
可以通過輸出JsonReader的讀入信息,來快速了解它的工作方式。
某Json的讀入打印
JsonReader的工作方式可以簡單理解為“讀到什么告訴你什么”。
盡管JsonWriter和JsonReader非常容易使用,但在實際運用中,所面對的數據結構通常都較為復雜。
本文記錄的是在處理相對復雜情況下的一些心得。
我們的目標是嘗試序列化和反序列化一場SLG戰斗(battleField),這場戰斗僅包含戰斗地圖(battleMap)和參戰單位(battleUnits)兩部分。
?
一場粗糙的戰斗
| 創建戰斗(戰場)
序列化戰場的前提是先要真正的創建一場戰斗。
按照示意圖的流程,用代碼輕松組織起一場戰斗吧。
創建戰斗
| 序列化戰斗
序列化戰斗與創建戰斗的套路一致,可簡單表示為:序列化戰斗 = 序列化地圖 + 序列化參戰單位。
為了偷懶,我們為JsonWriter增加一些常用的擴展。
準備一些方便使用的函數
逐級序列化戰斗
戰斗序列化完成,讓我們將Json導出,看一下結構。
戰場json文件
?
| 反序列化戰斗
反序列化較序列化而言要麻煩一些,原因在于,對象和數組比簡單的鍵值組合要復雜些;因為Reader的讀取特點是,你需要想一些辦法來記錄當前讀到的對象、數組都包含什么,以及它們的嵌套關系。
但當你把每一個對象、數組都清晰的提取出來后,問題就變成了”我讀到的這一個對象、數組或鍵值對,應該交給誰來處理,并變成什么?“。
為了讓結構清晰,我們讓各單位只做自己負責的事情,比如:戰場battleField反序列化json數據時,當讀取到了名為battleMap的json對象時,就交給battleMap自己處理,至于這個對象里還嵌套了別的東西(如:包含特殊格子索引的數組),或還想做特殊的處理邏輯(如:標記一些格子為特殊),都交給battleMap類的反序列化接口去解決。
同樣,為了偷懶,我們也為反序列化增加一些擴展。
準備一些方便使用的函數
部分逐級反序列化流程
| 驗證反序列化
一個相對簡單的方法來驗證反序列化,是將反序列化生成的戰斗,再重新序列化成新的Json文件,再與反序列化前讀取的Json文件對比,看是否完全一致。
通過對比文件檢驗反序列化是否出現了錯誤
以上就是使用JsonWriter和JsonReader進行序列化及反序列化的一些簡單體會。
對了,如果使用JsonMapper來做同樣的事情會是什么樣呢?
僅用兩行代碼就搞定了:
序列化
JsonMapper.ToJson(battleField);
反序列化
JsonMapper.ToObject<BattleField>(fieldData);
十分的方便!
... 圖源網絡
| 寫在最后
感覺好幾年沒更新了,都快忘了自己在維護一個公眾號的事兒了...水一篇先,慚愧。
其實,LitJson僅是一個工具而已,本文并不是想介紹LitJson的接口都有什么作用及如何使用(也根本沒這么做)。
我更想表達的東西是:無論一件事情有多復雜,我們總能找到方法去拆解它,用相似的結構去處理、分解它。最終就會發現,我們把它弄得更復雜了,可能這就是程序的魅力吧。
非常感謝您能讀到這里,下回見。
總結
以上是生活随笔為你收集整理的使用LitJson进行序列化和反序列化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 由浅到浅入门批量渲染(三)
- 下一篇: 入门顶点动画纹理的实例化绘制