學習之路二十七 三種序列化方式的一些注意點

2022-01-19 19:13:01 字數 1563 閱讀 8043

前段時間專案中有乙個這樣的需求:需要在service掛掉的情況下儲存記憶體中的資料!

因為我們的記憶體其實是乙個結構比較複雜的物件,巢狀的比較複雜,在沒有編碼之前把任務計畫都安排好了,方案是對記憶體物件進行json序列化之後儲存到本地檔案中去,其實想想挺簡單的,可是在實際編碼的時候還是遇到了很多關於序列化方面的問題,最大的原因就是我們對每一種序列化方式還理解的不夠!

下面就說說一些常用的序列化方式,文中可能會**比較少,主要說一些注意點!

1.二進位制序列化

優點:只要是標記了[serializable]序列化特性,那麼這個物件裡面的任何東西(私有的,公共的)都會被序列化成二進位制!

限制點:這種序列化方式就像眉毛鬍子一把抓,不管什麼東西就會被序列化,而且儲存到檔案的內容都是二進位制沒有任何可檢視的意義 - 看不懂啊!

不過我們也可以通過[nonserialized]設定哪些可以序列化,哪些不要序列化的!

2.json序列號

優點:跨平台資料傳輸,而且序列化之後的結構清晰易於解析!

限制點:可是我們在序列化的時候發現有這樣乙個問題(使用的fastjson類庫):

①如果物件中有沒有無參的建構函式,就會報錯(就是在底層**在反射該物件時會報錯)

如果使用.net自帶的json轉化類也會出現這樣的問題!

3.xml序列化

優點:跨平台資料傳輸,結構清晰,.net有強大的類庫支援!

限制點:可是有的時候卻不是萬能的,因為它有兩點點如下限制:

①比如下面中name屬性就不能被序列化,因為我們設定了set為私有的

1

public

class

test

24 }

②如果物件中有dictionary變數的話也會造成無法序列化

因為dictionary不支援xml序列化,也是自己實現xml序列化,不過有一種變通的方式,我們可以把dictionary中的key和value封裝成乙個物件,然後形成乙個list集合,那麼就可以使用xml序列化了,如:

1

public

class

person24

}56public

class

personkeyvalue79

10public person value 11}

1213

public

class

test

14);22}

2324

//最後再對list進行xml序列化就可以了25}

26 }

通過一種變通的方式就可以實現dictionary的xml序列化了!

最後我們使用了二進位制序列化解決了問題,其實最好的還是使用xml進行序列化,可是由於我們專案中的物件太過複雜,而且型別太多導致了xml序列化困難重重,無奈只好選擇了最搓的一種方法了!

以同步至:個人文章目錄索引

OpenGL學習二十七 混合

混合步驟 1.設定混合模式 2.啟用混合 glcolor4f 1.0f,1.0f,1.0f,0.5f 全亮度,50 alpha 混合 glblendfunc gl src alpha,gl one 基於源象素alpha通道值的半透明混合函式 glenable gl blend 開啟混合 opengl...

系統學習NLP(二十七) EMLo

deep contextualized word representations 參考 elmo的語言理解是通過 訓練單詞序列中的下乙個單詞來實現,這項任務被稱為語言建模。這是很方便的,因為我們有大量的文字資料,這樣的模型不需要標籤就可以從中學習。今天給大家介紹一篇2018年提出的 deep con...

學習第二十七天

一 this關鍵字 this關鍵字 this動態繫結物件 1 this所在的函式是否是通過new呼叫使用的,如果是指向當前new的物件 2 this是通過物件.函式名 使用,this指代當前呼叫的物件 3 this預設指代window,window指全域性物件 定義的全域性變數,預設定義window...