青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0
簡(jiǎn)介

  在這個(gè)框架中包含了一個(gè)序列化的基本框架,一套基本的類型識(shí)別系統(tǒng),可以識(shí)別基礎(chǔ)類型,復(fù)雜類型,自定義類型,STD的容器類型,而且可以這個(gè)基礎(chǔ)上進(jìn)行遞歸的擴(kuò)展。

  可以將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)序列化到文件,并從文件中恢復(fù)。

  包含了完整的自動(dòng)單元測(cè)試,和測(cè)試案例,點(diǎn)此下載。

  正文

  寫這個(gè)序列化框架最初是想用在一個(gè)大型的項(xiàng)目上,在那個(gè)項(xiàng)目中有一些相當(dāng)復(fù)雜的在運(yùn)行時(shí)構(gòu)建出來(lái)的樹(shù)形數(shù)據(jù)結(jié)構(gòu),如果可以將這個(gè)內(nèi)存樹(shù)序列化起來(lái)可以大大節(jié)約下次創(chuàng)建的時(shí)間。另外在自己做的一些小工具中,有些數(shù)據(jù)想保存在文件中,以后再?gòu)奈募凶x取,用序列化的方式也十分方便。而且那時(shí)正好系統(tǒng)的學(xué)習(xí)了一下C++模板技術(shù),感覺(jué)在一般的編程活動(dòng)中很難用到一些比較高級(jí)的模板技術(shù),所以想用C++模板技術(shù)來(lái)寫這個(gè)序列化框架。最后那個(gè)項(xiàng)目中沒(méi)有使用這個(gè)序列化框架,但我至少達(dá)到了第二個(gè)目標(biāo),寫這個(gè)序列化框架讓我對(duì)C++模板技術(shù)有了更深層次的理解。

  在這個(gè)框架中包含了一個(gè)序列化的基本框架,一套基本的類型識(shí)別系統(tǒng),可以識(shí)別基礎(chǔ)類型,復(fù)雜類型,自定義類型,STD的容器類型,而且可以這個(gè)基礎(chǔ)上進(jìn)行遞歸的擴(kuò)展。

  在寫這個(gè)框架的同時(shí),我也寫了完整的測(cè)試案例。如果沒(méi)有測(cè)試案例,要調(diào)試這樣的框架可就真是難與登天,因?yàn)槟0宸矫娴腻e(cuò)誤,編譯器報(bào)出來(lái)的信息很難看,有的根本就沒(méi)用。

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

  由于是用模板寫的比MFC中的運(yùn)行時(shí)序列化框架在效率上的表現(xiàn)要好得多。使用起來(lái)也相當(dāng)?shù)暮?jiǎn)單。如果要學(xué)習(xí)C++模板的高級(jí)技術(shù),研究一下這個(gè)框架可以獲益良多。由于是框架代碼,我寫得相當(dāng)規(guī)范,有注釋,也有完整的測(cè)試案例,可以進(jìn)行自動(dòng)的回歸測(cè)試。

  使用的方法比較簡(jiǎn)單請(qǐng)參考(fileRWTest.cpp)文件中的測(cè)試案例。

  普通的數(shù)據(jù)類型:

(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)可以直接序列化及反序列化。

  對(duì)于指針類型:

  會(huì)序列化指針具體指向的對(duì)象,如果指針指向的對(duì)象的類型是序列化框架無(wú)法識(shí)別的類型會(huì)報(bào)出編譯錯(cuò)誤。注意在反序列化時(shí),只需要傳一個(gè)空指針即可,序列化框架會(huì)將被序列化的對(duì)象的值反序列化到堆上,并將地址付給指針。如果傳一個(gè)有值的指針,在DEBUG模式下會(huì)在運(yùn)行時(shí)引發(fā)一個(gè)斷言錯(cuò)誤。在 RELEASE下會(huì)導(dǎo)致原來(lái)指針指向的對(duì)象被泄漏。


  對(duì)于普通數(shù)據(jù)類型的數(shù)組:

  會(huì)將整個(gè)數(shù)組以內(nèi)存拷貝的方式序列化到內(nèi)存,即使沒(méi)被真正賦值的元素。反序列化時(shí)傳一個(gè)相同類型的數(shù)組即可。需要注意的是,傳進(jìn)的數(shù)組的容量必須大于或等于被序列化的數(shù)組的容量,否則會(huì)引發(fā)數(shù)組越界的內(nèi)存錯(cuò)誤,在DEBUG模式下,會(huì)引發(fā)一個(gè)斷言錯(cuò)誤。

  非普通數(shù)據(jù)類型的數(shù)組:

  數(shù)組元素的類型可以是除普通數(shù)據(jù)類型之外的所有被序列化框架所支持的類型。序列化時(shí)會(huì)針對(duì)每一個(gè)元素調(diào)用序列化框架對(duì)它的具體序列化特化,反序列化時(shí)亦然。由于在RELEASE模式下類類型的數(shù)組在申明后,編譯器會(huì)生成調(diào)用相應(yīng)類的缺省構(gòu)造函數(shù)的代碼。但對(duì)于原始類型,如指針數(shù)組類型如果不顯式的手工初始化,數(shù)組中的值是無(wú)意的隨機(jī)值。這種情況序列化框架無(wú)法識(shí)別,會(huì)贊成嚴(yán)重的內(nèi)存錯(cuò)誤。另對(duì)于指針數(shù)組的某些元素為NULL的情況,序列化框架也無(wú)法處理,在DEBUG模式下會(huì)引發(fā)一個(gè)斷言錯(cuò)誤。

  因些如果是指針數(shù)組除非數(shù)組中的元素全部為有意義的指針,否則不應(yīng)該做為一個(gè)數(shù)組來(lái)序列化,而應(yīng)該加入相應(yīng)的遍歷邏輯,將有意思的元素逐個(gè)序列化。

  對(duì)于一般的數(shù)組,如果有意思的只是其中的少部分元素,也應(yīng)該以上述方式進(jìn)行序列化,以提高性能。

  自定義數(shù)據(jù)類類型:

  不需要拷貝構(gòu)造函數(shù),不需要拷貝賦值函數(shù),不需要析構(gòu)函數(shù)的類。如老式的struct結(jié)構(gòu)類型。這種類型可以通過(guò)直接拷貝內(nèi)存而被高效的序列化及化序列化。只需要讓一個(gè)類從_data_class_tag派生,序列化框架就會(huì)將它當(dāng)成普通的數(shù)據(jù)類類型處理。

  自定義復(fù)雜類型:

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

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;
}

  注意序列化和反序列化的順序這要錯(cuò)。

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

  使用比較簡(jiǎn)單。值得注意的是和將字符串?dāng)?shù)組做字符指針用的情況一樣。如果申明了一個(gè)容量很大的string(一般是為了避免在追加時(shí)的內(nèi)存重分配開(kāi)銷),卻只用了一小部分。序列化并反序列化,string對(duì)象的容量只是剛好有內(nèi)存的那部分。

  std::pair類型:

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

  std容器類型:

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

支持以上的容器類型,其中容器中的元素類型必須是序列化框架所支持的類型。
posted on 2008-07-19 13:15 chatler 閱讀(300) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺(jué)這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺(jué)得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区精品视频| 国产欧美视频一区二区| 精品白丝av| 亚洲欧美日韩国产一区| 亚洲国产一区二区a毛片| 欧美专区亚洲专区| 国产精品视频在线观看| 99视频精品全国免费| 欧美国产第二页| 欧美在线一二三区| 国产欧美日本一区视频| 亚洲尤物影院| 日韩午夜激情av| 欧美激情综合网| 亚洲精品123区| 免费看黄裸体一级大秀欧美| 欧美一区二区三区播放老司机| 国产精品对白刺激久久久| 一区二区三区产品免费精品久久75| 欧美成va人片在线观看| 久久九九国产| 韩国福利一区| 久久久综合精品| 欧美一区网站| 国产欧美va欧美不卡在线| 午夜日韩在线| 亚洲一区亚洲二区| 国产精品女人网站| 篠田优中文在线播放第一区| 中日韩视频在线观看| 国产精品二区二区三区| 亚洲男同1069视频| 在线性视频日韩欧美| 欧美性猛交99久久久久99按摩| 中文日韩在线| av成人免费在线| 欧美三级韩国三级日本三斤| 亚洲午夜一区二区三区| 亚洲视频在线二区| 国产美女精品| 久久精品亚洲乱码伦伦中文 | 亚洲夜间福利| 在线亚洲免费视频| 国产精品视频男人的天堂| 欧美一区二区视频网站| 午夜久久黄色| 精品成人一区| 亚洲国产精品黑人久久久| 欧美精品一区视频| 亚洲专区在线| 欧美一区二区三区啪啪| 亚洲大胆人体视频| 91久久精品国产91久久性色| 欧美日韩国产一区二区| 午夜免费在线观看精品视频| 亚洲欧美在线一区二区| 一区二区三区在线免费观看| 亚洲丰满少妇videoshd| 欧美日韩国产影院| 欧美专区在线| 美女被久久久| 亚洲视屏一区| 久久er精品视频| 亚洲激情在线播放| 在线亚洲欧美视频| 国产亚洲成精品久久| 欧美大片在线观看一区二区| 欧美日韩亚洲系列| 久久久av毛片精品| 欧美不卡高清| 午夜免费日韩视频| 久久综合中文字幕| 亚洲午夜性刺激影院| 欧美在线免费一级片| 亚洲三级影院| 亚洲男人天堂2024| 亚洲人永久免费| 亚洲一区图片| 亚洲国内在线| 亚洲在线一区二区| 最新精品在线| 亚洲自拍偷拍福利| 亚洲国产精品热久久| 亚洲性夜色噜噜噜7777| 亚洲国产精品成人| 亚洲一级电影| 亚洲国产日韩一区二区| 亚洲天堂男人| 91久久夜色精品国产网站| 亚洲永久在线观看| 最新国产成人在线观看| 午夜久久tv| 在线视频你懂得一区| 欧美在线综合| 亚洲一级黄色片| 久热这里只精品99re8久| 亚洲欧美日韩国产中文在线| 美女91精品| 久久岛国电影| 欧美日韩国产精品一区二区亚洲| 久久婷婷久久| 国产精品日韩在线| 亚洲激情网站| 黄色成人在线| 亚洲综合首页| aⅴ色国产欧美| 久久婷婷麻豆| 久久狠狠亚洲综合| 欧美日韩免费观看一区三区| 欧美不卡高清| 国产日韩欧美精品在线| aa成人免费视频| 亚洲精品综合| 久热精品在线视频| 久久人人超碰| 国产午夜亚洲精品不卡| 一区二区激情| 夜夜爽av福利精品导航 | 亚洲欧美在线高清| 中文在线一区| 欧美国产另类| 欧美国产激情| 激情欧美国产欧美| 午夜日韩在线| 亚洲免费小视频| 欧美日韩国产专区| 最新高清无码专区| 亚洲韩国青草视频| 久久只有精品| 美国十次成人| 一区二区三区在线观看视频| 欧美一区二区三区四区夜夜大片| 午夜精品久久久久久久99黑人| 欧美日韩色婷婷| 亚洲日本中文字幕| 亚洲免费大片| 欧美国产激情二区三区| 欧美ab在线视频| 亚洲第一精品久久忘忧草社区| 久久精品国产69国产精品亚洲| 久久精品一区| 国产亚洲精品久久飘花| 羞羞答答国产精品www一本| 欧美一区二区三区在线免费观看| 国产精品久久久久9999| 中国成人黄色视屏| 亚洲欧美日韩国产| 国产精品视频网址| 亚洲欧美精品在线观看| 久久福利视频导航| 国产视频久久网| 欧美在线观看一区| 美腿丝袜亚洲色图| 亚洲国内在线| 欧美精品一区二区三区久久久竹菊 | 亚洲国产精品一区二区第四页av| 另类综合日韩欧美亚洲| 亚洲第一黄色| 夜夜嗨av色一区二区不卡| 欧美日韩国产一中文字不卡| 亚洲作爱视频| 欧美亚洲一区二区在线观看| 国产欧美一区二区三区国产幕精品| 欧美一区二区三区电影在线观看| 久久一二三国产| 亚洲黄色免费网站| 欧美精品日本| 亚洲午夜久久久久久久久电影网| 欧美在线一二三四区| 加勒比av一区二区| 欧美成人精品高清在线播放| 亚洲精品美女久久7777777| 亚洲私人影院| 国产日韩精品在线| 久久亚洲国产精品日日av夜夜| 亚洲国产毛片完整版| 亚洲私人影院在线观看| 国产日韩一区二区三区在线播放 | 麻豆成人精品| 亚洲精品久久| 国产精品久久久久久久久动漫| 性色av香蕉一区二区| 欧美二区在线播放| 亚洲影院色无极综合| 国产综合精品| 欧美激情精品久久久久| 亚洲无限av看| 免费观看成人www动漫视频| 日韩视频免费观看| 国产美女搞久久| 免费观看欧美在线视频的网站| 一本久道综合久久精品| 久久久久久久久久久久久女国产乱 | 奶水喷射视频一区| 亚洲图片欧美一区| 欧美成人在线网站| 亚洲欧美另类在线观看| 亚洲高清不卡av| 国产精品久久久久av| 久久久精品一区|