今天利用編版本的時間研究了一下boost的序列化,特別是xml序列化的東東,還是有很多收穫,記下來怕以後忘記了,人老了,很多東東都記不得了......
(一)研究boost庫xml序列化要做準備的工作
a.下乙個最新的boost庫記住用1.32版本的,這個版本提供了xml序列化的支援
b.windows下用的vc7.0,這個是一定要了,我一直沒捨得換我的vc6,結果編譯boost的serialization的庫用了很多毛招就是編不過,實在沒辦法了,只好老老實實裝了vc7,原因是vc6對模版類的支援不好,比gcc差得很遠,vc7要強很多了......其實vc7也是挺好用的。
c.開啟boost/libs/serialization/vc7ide下的工程檔案,然後編lib就行了
d.做乙個新工程作測試用我的叫xmlser
e.記得一定要把工程的rtti的支援選上,我就是因為這個沒選,撓了半天的腦袋,具體設定property page->c/c++->language->enable run-time type info一定要選上(yes),我就是沒注意這個,結果在我序列化std::vector< int > ints; 的時候死要dynamic_cast上了,有興趣的可以到msdn上看一看關於rtti的文件,這些都準備好就可寫測試**了。
(二)boost的xml序列化的測試**
最好在做這部之前看看boost提供的助部份的文件,而且最好看看boost/libs/serialization/example下的例子程式,不過我建議最好不要直接用這部份**做試驗,一是比較複雜,二是你會不太了解其中的實現細節,下面就是一步步寫得測試**
#include "stdafx.h"
#include
#include
#include
#include
#pragma comment(lib,"libboost_serialization.lib")
class test
template< class archive >
void serialize( archive &ar , unsigned int filever )
int mvalue;
};int _tmain(int argc, _tchar* argv)
/*** load from archive */}
return 0;
}這裡要說明的就是如果你想使用std::vector等stl容器的序列化一定要包括#include 這句話,因為這個檔案定義了template
inline void serialize(
archive & ar,
std::vector& t,
const unsigned int file_version
)這樣乙個模版函式,這就是這個檔案的主要作用。有了這個檔案你就會發現boost和stl合作做序列化是一件多麼讓人愉快的事情啊,呵呵,boost庫真的很好用啊,快點兒成為標準吧......。
另外關於序列化東東,這裡用了乙個巨集boost_serialization_nvp,感興趣的可以看看巨集展開是什麼,xml_serialization序列化是乙個pair,原因很簡單,xml結點肯定需要乙個結點的名字,和結點的值對吧,所以這個巨集讓你可以直接用你想序列化的物件生成乙個叫nvp的物件,你可以不用這個巨集直接寫,寫成下面的形式也是可以的oa >> boost::serialization::make_nvp("vector",ints);這樣可以指定你想要結點名字我個人覺得這樣可能會更有用一些。
關於類的序列化要最基本要有乙個
template< class archive >
void serialize( archive &ar , unsigned int filever )
這樣的模版函式,因為最後編譯完所有的序列化實現都會經過這個函式。我試了乙個物件的序列化發現boost真是太好了
test* a = null;
oa >> boost_serialization_nvp(nvalue);
oa >> boost_serialization_nvp(ints);
oa >> boost_serialization_nvp(a);
boost用判斷物件指標為空調用load_pointer為你生成乙個物件有了這個功能真是太方便了,我跟蹤了一下實現**#@%
^&*,展開的名字太長了有兩個地方是實現這個功能的主要部份乙個是register_type,還有就是那個ar.load_pointer,沒有時間了,要休息了明天還有封版本,只能做到這裡了,有興趣的朋友可以試一下boost的**還是很好看懂的,把這部份都搞清了就成范型高手了......明天繼續。
利用Boost庫進行序列化
第一部分 vs2010 boost 安裝到指定目錄下,例如 二 在vs2010中使用boost庫 配置lib路徑 第二部分 序列化 我們希望能夠將類物件的成員變數中的值儲存下來,以便下次直接恢復使用。這可以通過序列化來實現,即將這些變數值保持下來,以後需要時直接將保持值恢復到類物件的成員變數中。簡言...
boost序列化與反序列化
include include include include include include include include include include 將字串序列化到檔案 void serialize str to file 從檔案中反序列化處字串 void deserialize file...
c 之boost庫序列化xml不能新增屬性問題
最近投入了c 的大家庭,搞了一段時間boost庫。對於序列化問題c 已經十分成熟,在c 由於第三方可靠庫比較少,google出了protobuf來支援跨平台之間的物件類傳輸資料的通訊問題,十分簡單實用。但本次所遇問題是不需要protobuf這種較大的附加庫,只能在原有的官方庫中尋找解決辦法。雖然困難...