亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

利用C++模板編寫的序列化框架

2019-11-17 05:17:48
字體:
來源:轉載
供稿:網友

  簡介

  在這個框架中包含了一個序列化的基本框架,一套基本的類型識別系統,可以識別基礎類型,復雜類型,自定義類型,STD的容器類型,而且可以這個基礎上進行遞歸的擴展。

  可以將復雜的數據結構序列化到文件,并從文件中恢復。

  包含了完整的自動單元測試,和測試案例,點此下載。

  正文

  寫這個序列化框架最初是想用在一個大型的項目上,在那個項目中有一些相當復雜的在運行時構建出來的樹形數據結構,假如可以將這個內存樹序列化起來可以大大節約下次創建的時間。另外在自己做的一些小工具中,有些數據想保存在文件中,以后再從文件中讀取,用序列化的方式也十分方便。而且那時正好系統的學習了一下C++模板技術,感覺在一般的編程活動中很難用到一些比較高級的模板技術,所以想用C++模板技術來寫這個序列化框架。最后那個項目中沒有使用這個序列化框架,但我至少達到了第二個目標,寫這個序列化框架讓我對C++模板技術有了更深層次的理解。

  在這個框架中包含了一個序列化的基本框架,一套基本的類型識別系統,可以識別基礎類型,復雜類型,自定義類型,STD的容器類型,而且可以這個基礎上進行遞歸的擴展。

  在寫這個框架的同時,我也寫了完整的測試案例。假如沒有測試案例,要調試這樣的框架可就真是難與登天,因為模板方面的錯誤,編譯器報出來的信息很難看,有的根本就沒用。

  代碼是在VC7.1下寫的,也只能在VC7.1下用,VC6對于C++模板的支持非常有限,而其他的編譯器在這方面的支持也有出入。假如要用于其他的編譯器可能要修改部分類型識別方面的代碼。測試框架我用的是cppunit(1.9.14),這是個開源的測試框架,可以在www.XPRogramming.com下載到。其中類型識別方面的代碼我主要是參考了《C++ template》一書,和boost中的部分代碼。

  由于是用模板寫的比MFC中的運行時序列化框架在效率上的表現要好得多。使用起來也相當的簡單。假如要學習C++模板的高級技術,研究一下這個框架可以獲益良多。由于是框架代碼,我寫得相當規范,有注釋,也有完整的測試案例,可以進行自動的回歸測試。

  使用的方法比較簡單請參考(fileRWTest.cpp)文件中的測試案例。

  普通的數據類型:

(unsigned char, unsigned short, unsigned int, unsigned long, signed char, signed short, signed int, signed long, bool, char, wchar_t, unsigned long long, signed long long, float, double, long double)可以直接序列化及反序列化。

  對于指針類型:

  會序列化指針具體指向的對象,假如指針指向的對象的類型是序列化框架無法識別的類型會報出編譯錯誤。注重在反序列化時,只需要傳一個空指針即可,序列化框架會將被序列化的對象的值反序列化到堆上,并將地址付給指針。假如傳一個有值的指針,在DEBUG模式下會在運行時引發一個斷言錯誤。在RELEASE下會導致原來指針指向的對象被泄漏。

利用C++模板編寫的序列化框架(圖一)
(點擊查看原圖) 
  對于普通數據類型的數組:

  會將整個數組以內存拷貝的方式序列化到內存,即使沒被真正賦值的元素。反序列化時傳一個相同類型的數組即可。需要注重的是,傳進的數組的容量必須大于或等于被序列化的數組的容量,否則會引發數組越界的內存錯誤,在DEBUG模式下,會引發一個斷言錯誤。

  非普通數據類型的數組:

  數組元素的類型可以是除普通數據類型之外的所有被序列化框架所支持的類型。序列化時會針對每一個元素調用序列化框架對它的具體序列化特化,反序列化時亦然。由于在RELEASE模式下類類型的數組在申明后,編譯器會生成調用相應類的缺省構造函數的代碼。但對于原始類型,如指針數組類型假如不顯式的手工初始化,數組中的值是無意的隨機值。這種情況序列化框架無法識別,會贊成嚴重的內存錯誤。另對于指針數組的某些元素為NULL的情況,序列化框架也無法處理,在DEBUG模式下會引發一個斷言錯誤。

  因些假如是指針數組除非數組中的元素全部為有意義的指針,否則不應該做為一個數組來序列化,而應該加入相應的遍歷邏輯,將有意思的元素逐個序列化。

  對于一般的數組,假如有意思的只是其中的少部分元素,也應該以上述方式進行序列化,以提高性能。

  自定義數據類類型:

  不需要拷貝構造函數,不需要拷貝賦值函數,不需要析構函數的類。如老式的strUCt結構類型。這種類型可以通過直接拷貝內存而被高效的序列化及化序列化。只需要讓一個類從_data_class_tag派生,序列化框架就會將它當成普通的數據類類型處理。

  自定義復雜類型:

  對于非數據類類型,必須從CSerializable派生,關在類的定義中加入SERIALIZABLE(name, x)宏,name是該類的名字,x是相應的版本號。版本號的引入主要是避免在一個類被修改后,和以前生成的序列化文件一起使用,以免引起內存錯誤。在類中還必須實現virtual bool Serialize(CMedia *) const;函數,在該函數中寫具體的序列化代碼。該函數的內容很簡單,按序列化及反序列化用為兩段,簡單的為每一個需要序列化及反序列化的成員函數調用即可,如下列:


if (pMedia->IsStoring()) {
 *pMedia << m_1 << m_2 << m_3 << m_4 << m_5;
 return true;
}
if (pMedia->IsLoading()) {
 *pMedia >> m_1 >> m_2 >> m_3 >> m_4 >> m_5;
 return true;
}
  注重序列化和反序列化的順序這要錯。

  std::string及std::wstring類型:

  使用比較簡單。值得注重的是和將字符串數組做字符指針用的情況一樣。假如申明了一個容量很大的string(一般是為了避免在追加時的內存重分配開銷),卻只用了一小部分。序列化并反序列化,string對象的容量只是剛好有內存的那部分。

  std::pair類型:

  只要是pair的first和second必須是序列化框架所支持的類型就可以被正常的序列化及反序列化。

  std容器類型:

(vector,list,deque,stack,queue,set,multiset,map,multimap)

  支持以上的容器類型,其中容器中的元素類型必須是序列化框架所支持的類型。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久婷婷国产麻豆91天堂| 日韩av一区在线| 亚洲白拍色综合图区| 欧美一区二区三区艳史| 一个色综合导航| 日韩电影中文字幕在线观看| 国产精品亚洲第一区| 九九九热精品免费视频观看网站| 亚洲精品免费av| 91免费国产视频| 日韩av最新在线| 日韩专区中文字幕| 精品成人国产在线观看男人呻吟| 亚洲国产精品人久久电影| 亚洲国语精品自产拍在线观看| 国产精品自在线| 亚洲成人黄色在线| 亚洲成人教育av| 亚洲天堂影视av| 亚洲欧美另类国产| 夜色77av精品影院| 狠狠久久亚洲欧美专区| 亚洲国产精品va在线看黑人动漫| 韩国欧美亚洲国产| 国产成人激情视频| 欧美性20hd另类| 久久久亚洲天堂| 日韩在线一区二区三区免费视频| 在线视频一区二区| 久久免费精品日本久久中文字幕| 91九色精品视频| 亚洲网址你懂得| 亚洲自拍偷拍网址| 国产精品三级在线| 午夜免费久久久久| 久久99热精品这里久久精品| 国产成人精品一区二区三区| 国产精品久久久久免费a∨| 日本欧美黄网站| 久久99热精品这里久久精品| 欧美做受高潮电影o| 欧美尺度大的性做爰视频| 国产精自产拍久久久久久蜜| 日韩久久免费电影| 亚洲日韩中文字幕在线播放| 欧美一区二区三区四区在线| 欧美野外wwwxxx| 国产精品极品美女在线观看免费| 欧美黑人巨大精品一区二区| 国产精品久久久久久久电影| 欧美日韩亚洲成人| 亚洲一区二区三区乱码aⅴ蜜桃女| 精品国偷自产在线| 色偷偷综合社区| 中文字幕精品av| 26uuu久久噜噜噜噜| 欧美日韩精品在线视频| 日韩经典一区二区三区| 亚洲精品日韩激情在线电影| 国产精品人成电影| 国产精品一区二区女厕厕| 久久欧美在线电影| 中文日韩在线视频| 国内外成人免费激情在线视频| 亚洲成年人在线| 久久久久北条麻妃免费看| 久久精品免费电影| 日韩视频中文字幕| 色悠悠久久久久| 日本伊人精品一区二区三区介绍| 国产精品热视频| 成人免费视频网| 日韩国产欧美区| 日韩精品视频免费专区在线播放| 欧美日韩午夜激情| 精品magnet| 亚洲xxx自由成熟| 韩国精品久久久999| 国产精品中文字幕在线观看| 日韩中文字幕网站| 欧美国产在线电影| 国产在线精品播放| 亚洲国产精品成人av| 97国产真实伦对白精彩视频8| 九九热精品视频国产| 欧美在线一级va免费观看| 国产精品永久免费在线| 久久精品成人一区二区三区| 亚洲高清免费观看高清完整版| 亲子乱一区二区三区电影| 欧美第一黄网免费网站| 欧美激情xxxx性bbbb| 亚洲91精品在线观看| 欧美激情亚洲一区| 色与欲影视天天看综合网| 亚洲一区二区免费在线| 日本一欧美一欧美一亚洲视频| 伊人久久综合97精品| 国产精品成熟老女人| 久久精品视频亚洲| 欧美色欧美亚洲高清在线视频| 久久久久久久久久久av| 欧美夫妻性生活视频| 欧美成年人在线观看| 久久久久北条麻妃免费看| 精品久久久久久久久久国产| 自拍偷拍亚洲在线| 国产日韩欧美在线播放| 久久免费视频观看| 亚洲九九九在线观看| 日韩成人激情视频| 亚洲第一免费播放区| 欧美在线观看网址综合| 欧美另类xxx| 成人国内精品久久久久一区| 国产精品一区专区欧美日韩| 久久久国产精彩视频美女艺术照福利| 亚洲日韩中文字幕| 久久伊人精品视频| 成人一区二区电影| 91精品国产自产在线老师啪| 久久影视电视剧凤归四时歌| 亚洲日本欧美中文幕| 国产精品视频一区二区高潮| 色综久久综合桃花网| 日韩高清电影免费观看完整| 亚洲精品免费网站| 欧美电影免费观看高清完整| 欧美大片免费观看在线观看网站推荐| 最新日韩中文字幕| 亚洲精品二三区| 91国内精品久久| 91av在线影院| 欧美日韩视频免费播放| 亚洲综合成人婷婷小说| 成人免费视频在线观看超级碰| 国产精品久久久久久av福利| 亚洲高清av在线| 韩剧1988在线观看免费完整版| 色妞一区二区三区| 欧美一区二区三区四区在线| 国内外成人免费激情在线视频网站| 精品成人69xx.xyz| 亚洲一区二区三区视频| 亚洲成人999| 欧美成人国产va精品日本一级| 91色在线观看| 亚洲性视频网站| 国产精品视频白浆免费视频| 欧美成人免费在线视频| 正在播放欧美一区| 中文字幕日韩欧美在线| 国产精品九九九| 亚洲香蕉伊综合在人在线视看| 亚洲精品永久免费| 欧美综合在线第二页| 国产偷亚洲偷欧美偷精品| 日韩中文字幕网| 国产精品永久免费| 精品视频9999| 亚洲欧美日韩网| 中文字幕一区电影| 国产精品福利无圣光在线一区| 91精品国产99久久久久久|