• <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>
            Cpper
            C/C++高級(jí)工程師 Android高級(jí)軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語(yǔ)言 程序猿
            本文是使用rapidxml序列化對(duì)象的例子
            源代碼源于Glooey GUI庫(kù)
            我使用rapidxml置換了其tinyxml并修改了很多原文的錯(cuò)誤
            devc++,vc9皆可編譯 ,vc7,vc8不知道能否編譯過(guò)去

            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對(duì)象序列化 
                
            ////////////////////////////////////////////////////////  
                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:
                
            ////////////////////////////////////////////////////////
                
            /// 對(duì)象序列化 
                
            //////////////////////////////////////////////////////// 
                template<typename T> 
                
            void Write(T& object)
                {
                    
            object.Serialize(*this);
                }

                
            ////////////////////////////////////////////////////////
                
            /// 指針對(duì)象序列化 
                
            //////////////////////////////////////////////////////// 
                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)格容器對(duì)象 
                
            //////////////////////////////////////////////////////// 
                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:
                
            ////////////////////////////////////////////////////////
                
            /// 反序列化一個(gè)泛型對(duì)象 
                
            ////////////////////////////////////////////////////////
                template<typename T> 
                
            void Read(T& object){object.Serialize(*this);}

                
            ////////////////////////////////////////////////////////
                
            /// 反序列化一個(gè)泛型對(duì)象指針 
                
            ////////////////////////////////////////////////////////
                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
            附注:做這個(gè)是因?yàn)槲乙匦伦鲆粋€(gè)游戲GUI庫(kù)
            posted on 2010-05-31 16:49 ccsdu2009 閱讀(3119) 評(píng)論(4)  編輯 收藏 引用 所屬分類: Game引擎
            Comments
            • # re: 基于rapidxml的對(duì)象序列化
              陳梓瀚(vczh)
              Posted @ 2010-05-31 19:30
              你在Archive的代碼里面重復(fù)了class的聲明,應(yīng)該想辦法去除。DRY。  回復(fù)  更多評(píng)論   
            • # re: 基于rapidxml的對(duì)象序列化
              ccsdu2009
              Posted @ 2010-06-01 13:24
              @陳梓瀚(vczh)
              沒(méi)看懂你想說(shuō)啥呵呵  回復(fù)  更多評(píng)論   
            • # re: 基于rapidxml的對(duì)象序列化
              陳梓瀚(vczh)
              Posted @ 2010-06-02 13:38
              @ccsdu2009
              你在Archive的函數(shù)里面重復(fù)了所有成員變量的名字。  回復(fù)  更多評(píng)論   
            • # re: 基于rapidxml的對(duì)象序列化
              陳梓瀚(vczh)
              Posted @ 2010-06-02 13:39
              @陳梓瀚(vczh)
              而且一般來(lái)說(shuō)也是需要重復(fù)所有的,所以應(yīng)該想辦法把他合并到聲明里面去  回復(fù)  更多評(píng)論   
             
            久久婷婷色综合一区二区| 日产精品99久久久久久| 99久久精品无码一区二区毛片| 久久国产乱子伦免费精品| 成人久久精品一区二区三区| 久久久久久国产精品免费免费| 中文字幕精品久久久久人妻| 国产产无码乱码精品久久鸭| 久久99精品久久久久久不卡| 亚洲精品无码成人片久久| segui久久国产精品| 久久亚洲精品国产精品婷婷| 好久久免费视频高清| 久久无码国产专区精品| 精品久久久久久久久久中文字幕| 综合人妻久久一区二区精品| 国产精品一区二区久久精品无码| 久久婷婷成人综合色综合| 久久综合九色欧美综合狠狠 | 久久不见久久见免费视频7| 国内精品久久久久久久涩爱 | 久久99精品国产麻豆不卡| 久久婷婷五月综合色奶水99啪| 欧美日韩精品久久久久| 99久久99久久精品国产片果冻| 久久久久亚洲AV无码麻豆| 欧美国产成人久久精品| 三级片免费观看久久| 久久国产精品波多野结衣AV | 99久久99久久久精品齐齐| 2021国内精品久久久久久影院| 99久久精品免费| 亚洲国产精品久久久久| 久久99精品国产99久久| 久久se精品一区精品二区| 精品久久久久久亚洲精品| 丰满少妇高潮惨叫久久久| 国产一级做a爰片久久毛片| 久久伊人精品青青草原高清| 久久这里只有精品首页| 精品久久人人妻人人做精品|