序列化及文本格式
需求背景
軟件項目在開發過程中,將大量初始化配置項在一定程度上保存在配置文件中。肯定有很多人有疑問,為什么不將這些信息放在軟件內存中。開機時與用戶交互進行確認?這肯定是一個好想法,但是如果配置太多或者太復雜就不是一個好主意了。我所在的行業,配置需要專門的人員進行管理,并花費大量時間調試配置。這里僅僅是討論一下配置的兩種方式,序列化和文本格式的配置文件的優劣,其他的配置文件方式暫時不過多敘述。
配置文件之序列化文本
在業界中,序列化文本常用兩種,json和xml文件。當有內存數據需要保存時,只需要調用程序提供的序列化接口直接一步到位將其序列化成流數據保存在文件中。軟件需要讀取這些數據時,只需要將其反序列化并可以獲取一個指定結構的對象。這種方法非常方便快捷。(序列化還有一個用到的地方就是傳輸,發送編碼時需要將對象序列化成字節流,接收解碼時將字節流反序列化成對象)
配置文件之普通文本
另外一種常用的配置就是文本,比如常用的ini或者txt文件。保存方法就是Open一個文本對象(設定模式),然后將內存對象調用C++庫函數將文本一行一行的Write進文本對象中(切記不是使用With包裹對象時,使用完之后,需要close對象,否則長時間會造成句柄溢出),讀取時重復上述操作,這個過程通常也是按照一行一行的讀取。
兩者比較
首先說下普通文本。對于本人來說,第一次接觸的是這種方式來和配置交互。這種對于初學者是很友好的,但是后來學習了序列化和反序列化之后,發現這種方式太繁瑣。比如,自己定義的一個對象有幾十個屬性,使用普通文本方法時,需要一行一行手動寫,再一行一行的讀取,代碼冗余不堪。使用序列化這個問題基本不存在,一行代碼就能搞定。但是代價也是有的,一旦文本和內存中定義的對象不一致時,常常就會報錯。json還好些,滿足規定格式就能過去,xml的這種,文本中有某種屬性,但是內存定義的類中沒有這種對象時,程序能立馬死給你看。在項目升級過程中,這種很是常見。比如該軟件在n年前配合xml部署了一次,現在要對這個項目進行升級。軟件已經迭代了n多次,類肯定頻繁的修改。假如配置只有這一個類,很方便的查找不同并修改。現實時配置文件十來個,每個的類有十來個。有點沒有改變,有的變化了結構,有點變化了內容含義。有任何一項配置沒有按照新版軟件來進行適應修改,那么軟件就會升級失敗。現實中,修改配置的時間一般很短,就會導致各種升級失敗,也就是常說的版本不兼容。txt倒是不存在這個問題,之前的存在就讀取,不存在就做默認值。軟件啟動不會因此拋異常。
總體來說,文本文件對人員更加直觀,錯了很容易手動修改(也很容易改錯),也有很強的兼容性。半結構化的數據對內存對象更加友好,序列化和反序列化時很方便,但是兼容性并不如普通文本。還有一種常用的配置文件比如bin,這種完全是人類不可閱讀的,其目的就是杜絕人手動修改,比較有意思的是有些配置文件以數據庫文件的方法來設置,這種就是完全方便人手動修改,這種方法可以對配置文件設置密碼,可以避免無關人員修改。