怎么使用Newtonsoft.Json 處理存在繼承關(guān)系的對象們

面向?qū)ο缶幊趟枷胫校?strong>繼承 確實是個好東西:提煉共性年缎、邏輯復(fù)用、里氏轉(zhuǎn)換铃慷。多少設(shè)計模式靈感都是以此為基點(diǎn)迸發(fā)单芜,可見 繼承 是多么重要,又是多么常見犁柜。
故而筆者覺得有必要帶大家過一下 Json 在是怎么處理存在繼承關(guān)系的 “對象們” 的洲鸠。

寫在前面:

一組繼承了基類的差異化對象群體,可以聲明基類類型的集合來統(tǒng)籌管理他們,這個就是里氏轉(zhuǎn)換帶來的便利扒腕。
Json 序列化和反序列化中如何原滋原味的保留這種 父親可以代言兒子 的特性呢绢淀?
可以預(yù)見,使用public IList<Business> Businesses來裝載下圖的Hotel瘾腰、Hostel對象皆的,
如果處理不好,反序列化后 Hostel 肯定會弄丟他的特殊服務(wù)蹋盆!哦不~是弄丟了SpecialService字段的數(shù)據(jù)祭务。

實現(xiàn):

其實呢,Newtonsoft.Json 真的是為親們的操碎了心,早早的就準(zhǔn)備好了案例怪嫌,筆者Keyin的這些個代碼便是直接Ctrl+C义锥、Ctrl+V過來的,真懶岩灭!

namespace zFrame.Demo
{
    using Newtonsoft.Json;
    using System.Collections.Generic;
    using System.IO;
    using UnityEngine;

    public abstract class Business
    {
        public string Name { get; set; }
    }
    public class Hotel : Business
    {
        public int Stars { get; set; }
    }
    public class Hostel : Business
    {
        /// <summary>特殊服務(wù)</summary>
        public string SpecialService { get; set; }
        public int Stars { get; set; }
    }

    public class Stockholder
    {
        public string FullName { get; set; }
        public IList<Business> Businesses { get; set; }
    }

    public class JsonSerializationDemo : MonoBehaviour
    {
        string path;
        Stockholder stockholder;
        private void Start()
        {
            path = FolderMaker.Creat(this, "json");
            Stockholder stockholder = new Stockholder
            {
                FullName = "Steve Stockholder",
                Businesses = new List<Business>
                {
                    new Hotel
                     {
                           Name = "Hudson Hotel",
                           Stars = 4
                     },
                    new Hostel
                    {
                        SpecialService="電擊療法",
                        Name="特殊人類研究所",
                        Stars=1
                    }
                 }
            };

            string jsonTypeNameAll = JsonConvert.SerializeObject(stockholder, Formatting.Indented, new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.All
            });

            Debug.Log(jsonTypeNameAll);

            using (StreamWriter writer=File.CreateText(path+"/Data.json") )
            {
                writer.WriteLine(jsonTypeNameAll);
            }

        }

        private void Update()
        {
            if (Input.GetKeyDown(KeyCode.T))
            {
                string json = File.ReadAllText(path + "/Data.json");
                Debug.Log(json);
                stockholder = JsonConvert.DeserializeObject<Stockholder>(json, new JsonSerializerSettings()
                {
                    TypeNameHandling = TypeNameHandling.Auto
                });

            }
        }
    }
}
  1. 為確保反系列化時類型正確拌倍,在序列化的時候必須使用創(chuàng)建一個序列化配置器,如下:


  2. 為了確保反序列化成功噪径,在執(zhí)行反序列化的時也需要創(chuàng)建配置器柱恤,如下:


    不可或缺哦
  3. 上面的代碼中有一個奇奇怪怪的類:FolderMaker ,筆者用它獲取Demo腳本的同級目錄找爱,方便保存序列化的數(shù)據(jù), 往后不管Demo怎么被移植梗顺,這個反序列的數(shù)據(jù)永遠(yuǎn)在同級目錄下呢。

動畫演示:

demo

Tips:

  • 運(yùn)行后腳本同級生成名稱為 “Json” 的文件夾车摄,刷新可見保存了的反序列化文件寺谤。
  • 打開反序列化文件,可見 Json 數(shù)據(jù)都是包含了類型了的吮播, 用 $type 鍵映射变屁。
  • 筆者修改了 Json 數(shù)據(jù),按 T 反序列化意狠,斷點(diǎn)調(diào)試可見數(shù)據(jù)都正確的被抓取過來了粟关。

擴(kuò)展閱讀:

TypeNameHandling setting
Unity3d 使用代碼在腳本同級目錄下創(chuàng)建文件夾 - FolderMaker

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市环戈,隨后出現(xiàn)的幾起案子闷板,更是在濱河造成了極大的恐慌,老刑警劉巖院塞,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遮晚,死亡現(xiàn)場離奇詭異,居然都是意外死亡迫悠,警方通過查閱死者的電腦和手機(jī)鹏漆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人艺玲,你說我怎么就攤上這事括蝠。” “怎么了饭聚?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵忌警,是天一觀的道長。 經(jīng)常有香客問我秒梳,道長法绵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任酪碘,我火速辦了婚禮朋譬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兴垦。我一直安慰自己徙赢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布探越。 她就那樣靜靜地躺著狡赐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钦幔。 梳的紋絲不亂的頭發(fā)上枕屉,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音鲤氢,去河邊找鬼搀擂。 笑死,一個胖子當(dāng)著我的面吹牛铜异,可吹牛的內(nèi)容都是我干的哥倔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼揍庄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了东抹?” 一聲冷哼從身側(cè)響起蚂子,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缭黔,沒想到半個月后食茎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馏谨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年别渔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡哎媚,死狀恐怖喇伯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拨与,我是刑警寧澤稻据,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站买喧,受9級特大地震影響捻悯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淤毛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一今缚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧低淡,春花似錦姓言、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纸颜,卻和暖如春兽泣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胁孙。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工唠倦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涮较。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓稠鼻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狂票。 傳聞我的和親對象是個殘疾皇子候齿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1、前言 《手冊》第 9 頁 “OOP 規(guī)約” 部分有一段關(guān)于序列化的約定 1: 【強(qiáng)制】當(dāng)序列化類新增屬性時闺属,請...
    sakura579閱讀 751評論 0 0
  • 泛型: https://juejin.im/post/5b614848e51d45355d51f792#headi...
    RexHuang閱讀 6,851評論 0 0
  • Android 存儲優(yōu)化系列專題 SharedPreferences 系列 《Android 之不要濫用 Shar...
    godliness閱讀 1,947評論 0 6
  • 為了更好的學(xué)習(xí)Gson慌盯,特將Gson User Guide翻譯如下。由于本人英文水平有限掂器,如有錯誤亚皂,還請指正,謝謝...
    WeberLisper閱讀 6,823評論 0 6
  • 兩個學(xué)生和店長“投訴”:老師教的舞蹈太快国瓮,動作跟不上灭必,節(jié)奏跟不上狞谱,沒有完整的學(xué)會一支舞,“考試不過關(guān)”還被罰做俯臥...
    瑩瑩樂道閱讀 128評論 0 1