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

Cpper
C/C++高級工程師 Android高級軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語言 程序猿
本文是使用rapidxml序列化對象的例子
源代碼源于Glooey GUI庫
我使用rapidxml置換了其tinyxml并修改了很多原文的錯誤
devc++,vc9皆可編譯 ,vc7,vc8不知道能否編譯過去

1.例子如下:
#include <stdio.h>
#include 
<stdlib.h>
#include 
"XMLOutputArchive.h"
#include 
"XMLInputArchive.h" 

#define LOAD_XML
#define XML_FILE "xml.xml"

struct Point
{
    
int x_;
    
int y_;
    template
<typename Archive> 
    
void Serialize(Archive& archive)
    {
        archive 
& TAGGED_OBJECT(x) & TAGGED_OBJECT(y);
    }
}; 

REGISTER_CLASS(Point)

struct Color
{
    
float red_,green_,blue_,alpha_;       
    template
<typename Archive> 
    
void Serialize(Archive& archive)
    {
        archive 
&TAGGED_OBJECT(red) 
                
&TAGGED_OBJECT(green)
                
&TAGGED_OBJECT(blue)
                
&TAGGED_OBJECT(alpha);
    }    
};

struct Person
{
   engine_string name_;
   
int           age_;
   Person():name_(
"XXX"),age_(-1){}  
   template
<typename Archive> 
   
void Serialize(Archive& archive)
   {
        archive 
&TAGGED_OBJECT(name) 
                
&TAGGED_OBJECT(age);
   }          
};

REGISTER_CLASS(Color)
REGISTER_CLASS(Person)

struct Rect
{
    Point from_,to_;          
    template
<typename Archive> 
    
void Serialize(Archive& anArchive)
    {
        anArchive 
& TAGGED_OBJECT(from) & TAGGED_OBJECT(to);
    }      
};

REGISTER_CLASS(Rect)

int main()
{
      Point point;  
      std::pair
<int,int> p_(-1,-2);
      Rect rect;    
      Color color;
      Person person;
      
#ifndef LOAD_XML      
      point.x_ 
= 1;
      point.y_
= 2;
      p_.first 
= 3;
      p_.second 
= 4;      
      rect.from_.x_ 
= 1;
      rect.from_.y_ 
= 2;
      rect.to_.x_ 
= 3;
      rect.to_.y_ 
= 4;  
      color.red_ 
= 1.0f;
      color.blue_ 
= 0.2f;
      color.green_ 
= 0.4f;
      color.alpha_ 
= 0.1f;
      person.name_ 
= "娃娃";
      person.age_ 
= 1;    
      
      XMLOutputArchive xml;
      xml 
&ObjectNamer<Point>("point",point) 
          
&ObjectNamer<std::pair<int,int> >("pair",p_)
          
&ObjectNamer<Point>("size",point)
          
&ObjectNamer<Color>("color",color)
          
&ObjectNamer<Rect>("rect",rect)
          
&ObjectNamer<Person>("preson",person);
      xml.Save(XML_FILE);        
#else  
      XMLInputArchive archive(XML_FILE);
      archive 
&ObjectNamer<Rect>("rect",rect);
      std::cout
<<rect.from_.x_<<" "<<rect.from_.y_<<" "<<rect.to_.x_<<" "<<rect.to_.y_<<std::endl;
      archive 
&ObjectNamer<std::pair<int,int> >("pair",p_);
      std::cout
<<p_.first<<" "<<p_.second<<std::endl;
      archive 
&ObjectNamer<Color>("color",color);
      std::cout
<<"color "<<color.red_<<" "<<color.blue_<<" "<<color.green_<<" "<<color.alpha_<<std::endl;
      archive 
&ObjectNamer<Person>("preson",person); 
      std::cout
<<person.name_<<" "<<person.age_<<std::endl; 
#endif                  
      system(
"pause");
      
return 0;
}


2.相關(guān)代碼()
序列化和反序列化
////////////////////////////////////////////////////////////
/// XML序列化檔案 
//////////////////////////////////////////////////////////// 
class XMLOutputArchive
{
public:
    
////////////////////////////////////////////////////////
    
/// XML序列化檔案構(gòu)造和析構(gòu) 
    
////////////////////////////////////////////////////////    
    XMLOutputArchive();
    
virtual ~XMLOutputArchive(); 
public:
    
////////////////////////////////////////////////////////
    
/// XML對象序列化 
    
////////////////////////////////////////////////////////  
    template<typename T> 
    XMLOutputArchive
& operator&(const ObjectNamer<T>& object)
    {
        current_node
->append_node(doc.allocate_node(rapidxml::node_element,doc.allocate_string(object.GetName().c_str())));
        rapidxml::xml_node
<>* node = current_node;
        current_node 
= current_node->last_node();
        Write(
object.GetObject());
        current_node 
= node;
        
return *this;
    }
    
    
////////////////////////////////////////////////////////
    
/// XML文件保存 
    
////////////////////////////////////////////////////////   
    void Save(const engine_string& xml);   
private:
    
////////////////////////////////////////////////////////
    
/// 對象序列化 
    
//////////////////////////////////////////////////////// 
    template<typename T> 
    
void Write(T& object)
    {
        
object.Serialize(*this);
    }

    
////////////////////////////////////////////////////////
    
/// 指針對象序列化 
    
//////////////////////////////////////////////////////// 
    template<typename T> 
    
void Write(T*& object)
    {
        
if(object != 0)
        {
            FactoryInterface
* factory = FactoryInterface::GetFactoryByClassName(typeid(*object).name());
            factory
->Serialize(typeid(*this).name(),(void*)(this),(void*&)(object));
        }
    }

    
////////////////////////////////////////////////////////
    
/// stl容器序列化 
    
//////////////////////////////////////////////////////// 
    template<typename T> 
    
void Write(std::vector<T>& container){WriteContainer(container);}
    template
<typename T> 
    
void Write(std::list<T>& container){WriteContainer(container);}
    template
<typename T> 
    
void Write(std::deque<T>& container){WriteContainer(container);}
    template
<typename T1,typename T2> 
    
void Write(std::map<T1, T2>& container){writeContainer(container);}
    template
<typename T1,typename T2> 
    
void Write(std::pair<T1, T2>& _pair)
    {
        rapidxml::xml_node
<>* node = current_node;
        current_node 
=  doc.allocate_node(rapidxml::node_element,"first");
        node
->append_node(current_node);
        Write(_pair.first);
        node 
= current_node;
        current_node 
= doc.allocate_node(rapidxml::node_element,"second");
        node
->parent()->append_node(current_node);
        current_node 
= node->parent();
        current_node 
= current_node->last_node("second");
        Write(_pair.second);
        current_node 
= node->parent()->parent();
    }

    
////////////////////////////////////////////////////////
    
/// 序列化POD數(shù)據(jù) 
    
//////////////////////////////////////////////////////// 
    void Write(char data);
    
void Write(unsigned char data);
    
void Write(int data);
    
void Write(unsigned int data);
    
void Write(bool data);
    
void Write(float data);
    
void Write(double data);
    
void Write(const engine_string& data);
    
void Write(engine_string& data);

    
////////////////////////////////////////////////////////
    
/// 序列化stl風(fēng)格容器對象 
    
//////////////////////////////////////////////////////// 
    template<typename Container> 
    
void WriteContainer(Container& container)
    {   
        rapidxml::xml_node
<>* node = current_node;
        
for(typename Container::iterator it = container.begin(); it != container.end(); ++it)
        {
            rapidxml::xml_node
<>* element = doc.allocate_node(rapidxml::node_element,"item");
            node
->append_node(element);
            current_node 
= node->last_node(); 
            Write(
*it);
        }       
        current_node 
= node; 
    }

    template
<typename T> 
    
void PolymorphicWrite(T*& object)
    {
        
object->Serialize(*this);
    }

    rapidxml::xml_document
<> doc;
    rapidxml::xml_node
<>*    current_node; 
};

3。
////////////////////////////////////////////////////////////
/// XML反序列化檔案 
//////////////////////////////////////////////////////////// 
class XMLInputArchive
{
public:
    
////////////////////////////////////////////////////////
    
/// 構(gòu)造和析構(gòu)XML反序列化檔案 
    
////////////////////////////////////////////////////////        
    XMLInputArchive(const engine_string& xml);
    
~XMLInputArchive();
public:
    
////////////////////////////////////////////////////////
    
/// 序列化接口 
    
////////////////////////////////////////////////////////
    template<typename T> 
    XMLInputArchive
& operator&(const ObjectNamer<T>& object);
private:
    
////////////////////////////////////////////////////////
    
/// 反序列化一個泛型對象 
    
////////////////////////////////////////////////////////
    template<typename T> 
    
void Read(T& object){object.Serialize(*this);}

    
////////////////////////////////////////////////////////
    
/// 反序列化一個泛型對象指針 
    
////////////////////////////////////////////////////////
    template<typename T> 
    
void Read(T*& object); 

    
////////////////////////////////////////////////////////
    
/// 反序列化stl容器 
    
////////////////////////////////////////////////////////
    template<typename T> 
    
void Read(std::vector<T>& container){ReadContainer(container);}
    template
<typename T> 
    
void Read(std::list<T>& container){ReadContainer(container);}
    template
<typename T> 
    
void Read(std::deque<T>& container){ReadContainer(container);}
    template
<typename T1, typename T2> 
    
void Read(std::map<T1, T2>& container){ReadContainer(container);}
    template
<typename T1, typename T2> 
    
void Read(std::pair<T1, T2>& node); 

    
////////////////////////////////////////////////////////
    
/// 反序列化POD數(shù)據(jù) 
    
////////////////////////////////////////////////////////
    void Read(char& data);
    
void Read(unsigned char& data);
    
void Read(int& anInteger);
    
void Read(unsigned int& data);
    
void Read(bool& boolean);
    
void Read(float& data);
    
void Read(double& data);
    
void Read(engine_string& string);
 
    template
<typename T> 
    
void ReadPrimitive(T& data)
    {   
        rapidxml::xml_node
<>* node = current_node->first_node();
        
if(node != NULL)
        {    
            data 
= string_cast<T>(node->value());
        }
    }

    
////////////////////////////////////////////////////////
    
/// 反序列化stl容器 
    
////////////////////////////////////////////////////////
    template<typename Container> 
    
void ReadContainer(Container& container);
 
    
void DetermineClassName(rapidxml::xml_node<>* element);
    rapidxml::xml_document
<>  doc;
    rapidxml::xml_node
<>*     current_node;   
    engine_string             classname;
};
x相關(guān)的例子代碼在這里:
/Files/gaimor/archive.zip
附注:做這個是因為我要重新做一個游戲GUI庫
posted on 2010-05-31 16:49 ccsdu2009 閱讀(3139) 評論(4)  編輯 收藏 引用 所屬分類: Game引擎
Comments
  • # re: 基于rapidxml的對象序列化
    陳梓瀚(vczh)
    Posted @ 2010-05-31 19:30
    你在Archive的代碼里面重復(fù)了class的聲明,應(yīng)該想辦法去除。DRY。  回復(fù)  更多評論   
  • # re: 基于rapidxml的對象序列化
    ccsdu2009
    Posted @ 2010-06-01 13:24
    @陳梓瀚(vczh)
    沒看懂你想說啥呵呵  回復(fù)  更多評論   
  • # re: 基于rapidxml的對象序列化
    陳梓瀚(vczh)
    Posted @ 2010-06-02 13:38
    @ccsdu2009
    你在Archive的函數(shù)里面重復(fù)了所有成員變量的名字。  回復(fù)  更多評論   
  • # re: 基于rapidxml的對象序列化
    陳梓瀚(vczh)
    Posted @ 2010-06-02 13:39
    @陳梓瀚(vczh)
    而且一般來說也是需要重復(fù)所有的,所以應(yīng)該想辦法把他合并到聲明里面去  回復(fù)  更多評論   
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日本中文字幕| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲综合国产| 欧美第一黄网免费网站| 亚洲欧美视频一区二区三区| 亚洲美女视频| 亚洲欧洲日产国产网站| 伊人婷婷欧美激情| 国产综合久久| 国产欧美一区二区三区久久| 久久日韩粉嫩一区二区三区| 久久深夜福利免费观看| 永久免费视频成人| 国产乱人伦精品一区二区| 欧美高清视频在线观看| 免费成人高清在线视频| 久久国产天堂福利天堂| 9色精品在线| 亚洲调教视频在线观看| 一区二区高清视频| 先锋a资源在线看亚洲| 亚洲一区自拍| 欧美不卡高清| 中文在线一区| 一区二区动漫| 欧美在线观看视频在线| 亚洲一区二区免费视频| 中文网丁香综合网| aⅴ色国产欧美| 一区二区三区日韩在线观看| 先锋影音久久| 久久只有精品| 欧美成熟视频| 精品1区2区| 亚洲综合首页| 亚洲人成网站精品片在线观看| 亚洲精品少妇网址| 久久久亚洲成人| 国产午夜一区二区三区| 最近中文字幕日韩精品 | 欧美怡红院视频| 欧美精品乱码久久久久久按摩| 国产精品一区二区在线观看| 在线综合亚洲| 国产亚洲一区二区三区在线观看 | 欧美成人精品h版在线观看| 亚洲综合精品| 中文亚洲欧美| 久久九九精品99国产精品| 欧美成人网在线| 亚洲一区在线播放| 欧美日韩国产大片| 亚洲国产精品一区二区第一页 | 99国产精品久久久久久久久久 | 亚洲深爱激情| 欧美日韩国产精品一区| 日韩视频一区二区三区在线播放| 美女视频黄 久久| 欧美在线日韩精品| 国产午夜精品全部视频播放 | 亚洲欧美电影院| 国产精品人人做人人爽| 性久久久久久久久| 亚洲尤物影院| 国产一区二区三区观看| 久久久91精品国产| 久久国产精品色婷婷| 在线国产日韩| 亚洲国产精品va在线看黑人动漫 | 黄色日韩精品| 国产精品免费福利| 蜜月aⅴ免费一区二区三区| 国产亚洲第一区| 性色av一区二区三区在线观看| 亚洲一二三区在线观看| 国产精品制服诱惑| 久久午夜影视| 免播放器亚洲| 亚洲在线视频观看| 欧美亚洲综合久久| 亚洲国产成人一区| 亚洲精品一区中文| 国产精品一区二区黑丝| 久久夜色精品国产| 欧美大片91| 午夜免费久久久久| 欧美一区在线直播| 亚洲国产精品999| 亚洲精品乱码久久久久久按摩观| 欧美性大战久久久久久久| 久久久久久久波多野高潮日日 | 亚洲女人av| 久久精品国产2020观看福利| 在线观看成人小视频| 日韩午夜在线电影| 国产一区二区三区四区| 亚洲国产综合在线看不卡| 欧美性猛交视频| 欧美成va人片在线观看| 国产精品久99| 欧美激情在线狂野欧美精品| 欧美三级中文字幕在线观看| 久久综合精品国产一区二区三区| 欧美精品国产一区二区| 美日韩精品视频免费看| 欧美性淫爽ww久久久久无| 欧美成人一区二免费视频软件| 欧美视频日韩| 亚洲国产精彩中文乱码av在线播放| 国产精品高潮呻吟久久av无限| 老司机精品视频网站| 国产精品日韩精品| 欧美激情成人在线| 国产在线乱码一区二区三区| 一本大道久久精品懂色aⅴ| 狠狠88综合久久久久综合网| aaa亚洲精品一二三区| 亚洲国产视频a| 久久成人免费| 欧美专区一区二区三区| 欧美午夜www高清视频| 亚洲人成绝费网站色www| 亚洲国产欧美精品| 久热精品在线| 久久日韩粉嫩一区二区三区| 国产免费成人av| 亚洲天堂成人在线视频| 亚洲视频一区二区| 欧美日韩久久久久久| 亚洲精品视频在线播放| 亚洲精品日韩精品| 欧美国产一区二区三区激情无套| 亚洲盗摄视频| 久久亚洲国产成人| 国产欧美一区二区白浆黑人| 亚洲视频在线播放| 亚洲欧美国产视频| 国产精品av久久久久久麻豆网| 91久久精品www人人做人人爽 | 久久久久久国产精品mv| 久久香蕉国产线看观看av| 国产精品自拍网站| 亚洲女人天堂成人av在线| 欧美一二三区在线观看| 国产日韩欧美黄色| 久久久久这里只有精品| 欧美肥婆在线| 亚洲最新视频在线播放| 欧美性理论片在线观看片免费| 亚洲一区二区精品在线| 欧美在线精品一区| 狠狠狠色丁香婷婷综合久久五月| 久久狠狠一本精品综合网| 美女黄网久久| 一本色道久久综合狠狠躁篇怎么玩| 欧美日韩国产精品| 午夜免费久久久久| 欧美jizz19hd性欧美| 9久re热视频在线精品| 国产精品久久久久久久午夜片| 午夜精品久久久久久久久久久久久| 久久深夜福利| 一本一道久久综合狠狠老精东影业 | 蜜月aⅴ免费一区二区三区 | 一区二区三区福利| 国产精品高潮视频| 久久精品综合网| 亚洲毛片av| 久久久久久久网站| 亚洲免费成人| 国产一区二区三区在线免费观看| 免费观看日韩| 亚洲欧美高清| 91久久夜色精品国产九色| 午夜精品久久久久久| 亚洲高清久久久| 国产精品视频免费一区| 麻豆精品网站| 欧美一区二区三区四区夜夜大片| 欧美激情欧美激情在线五月| 亚洲一区二区视频在线观看| 国产一区免费视频| 欧美精品一区在线播放| 午夜精品免费| 亚洲精品在线免费观看视频| 蜜臀va亚洲va欧美va天堂| 先锋资源久久| 中文一区二区在线观看| 亚洲国产午夜| 韩国一区二区三区在线观看| 欧美小视频在线| 欧美日韩岛国| 在线视频精品| 亚洲精品久久7777| 欧美激情国产日韩| 久久九九精品| 亚洲欧美伊人| 亚洲综合日韩| 一区二区三区免费网站| 91久久精品美女|