• <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>
            隨筆-341  評論-2670  文章-0  trackbacks-0
                跟上一篇文章一樣,一樣的數據結構,但是添加了對數組、列表和映射的更多的支持。首先是代碼,然后是序列化后的XML文件。

                這里的代碼展示了如和向object inspector注冊自己感興趣的類和成員。至于成員的類型和容器里面的東西,會自動判斷。
              1 #include "..\..\..\..\VL++\Library\Platform\VL_Console.h"
              2 #include "..\..\..\..\VL++\Library\Data\Inspector\VL_ObjectInspector.h"
              3 #include "..\..\..\..\VL++\Library\Data\Inspector\VL_ObjectStrconv.h"
              4 #include "..\..\..\..\VL++\Library\Data\Inspector\VL_ObjectXML.h"
              5 #include "..\..\..\..\VL++\Library\Data\VL_DataAccess.h"
              6 #include "..\..\..\..\VL++\Library\Data\VL_System.h"
              7 
              8 using namespace vl;
              9 using namespace vl::platform;
             10 using namespace vl::inspector;
             11 using namespace vl::stream;
             12 using namespace vl::system;
             13 
             14 class Animal : public VL_Base
             15 {
             16 public:
             17     VInt                Age;
             18     VInt                Weight;
             19 };
             20 
             21 class Mammalian : public Animal
             22 {
             23 public:
             24     VInt                FingerCount;
             25 };
             26 
             27 class Cat : public Mammalian
             28 {
             29 public:
             30     VInt                BodyLength;
             31     VInt                TailLength;
             32 
             33     Cat()
             34     {
             35         Age=10;
             36         Weight=100;
             37         FingerCount=18;
             38         BodyLength=50;
             39         TailLength=30;
             40     }
             41 };
             42 
             43 class Fish : public Animal
             44 {
             45 public:
             46     VDouble                MaxDepth;
             47     VInt                Length;
             48 
             49     Fish()
             50     {
             51         Age=20;
             52         Weight=200;
             53         MaxDepth=3000;
             54         Length=25;
             55     }
             56 };
             57 
             58 class Bird : public Animal
             59 {
             60 public:
             61     VBool                CanFly;
             62     VUnicodeString        Name;
             63 
             64     Bird()
             65     {
             66         Age=30;
             67         Weight=300;
             68         CanFly=true;
             69         Name=L"Jack";
             70     }
             71 };
             72 
             73 class Human : public Mammalian
             74 {
             75 public:
             76     VUnicodeString                                                Name;
             77     VL_AutoPtr<Animal>                                            MainPat;
             78     Bird                                                        MainTransportation;
             79     VL_AutoPtr<Animal>                                            OtherPats[4];
             80     Bird                                                        OtherTranspotations[3];
             81     VL_List<VL_AutoPtr<Animal> , false , Animal*>                OtherPatsList;
             82     VL_List<Bird , false>                                        OtherTranspotationsList;
             83     VL_ListedMap<VUnicodeString , VL_AutoPtr<Animal>>            PatMap;
             84     VL_MultiMap<VUnicodeString , VL_AutoPtr<Animal> , false , VUnicodeString , Animal*>    PatMultiMap;
             85 
             86     Human()
             87     {
             88         Age=16;
             89         Weight=2000;
             90         FingerCount=20;
             91         Name=L"囧Smith";
             92 
             93         Cat* cat=new Cat;
             94         cat->Age=5;
             95         cat->Weight=150;
             96         cat->BodyLength=40;
             97         cat->TailLength=20;
             98         MainPat=cat;
             99 
            100         MainTransportation.Name=L"Red Dragon";
            101         MainTransportation.Age=3000;
            102 
            103         OtherPats[0]=new Cat;
            104         OtherPats[1]=new Fish;
            105         OtherPats[2]=new Bird;
            106 
            107         for(VInt i=0;i<3;i++)
            108         {
            109             OtherTranspotations[i].Name=L"Blue Dragon "+VUnicodeString(i+1);
            110             OtherTranspotations[i].Age=3000+i*100;
            111         }
            112 
            113         OtherPatsList.Add(new Cat);
            114         OtherPatsList.Add(new Fish);
            115         OtherPatsList.Add(new Bird);
            116 
            117         for(VInt i=0;i<3;i++)
            118         {
            119             OtherTranspotationsList.Add(Bird());
            120             OtherTranspotationsList[i].Name=L"Green Dragon "+VUnicodeString(i+1);
            121             OtherTranspotationsList[i].Age=3000+i*10;
            122         }
            123 
            124         PatMap.Add(L"Cat",new Cat);
            125         PatMap.Add(L"Fish",new Fish);
            126         PatMap.Add(L"Bird",new Bird);
            127 
            128         PatMultiMap.Add(L"A",new Cat);
            129         PatMultiMap.Add(L"A",new Fish);
            130         PatMultiMap.Add(L"B",new Bird);
            131     }
            132 };
            133 
            134 VL_BEGIN_INSPECTOR_DECLARATION
            135 
            136     VL_BEGIN_BASE_CLASS(Animal)
            137         VL_ADD_CLASS_MEMBER(Age)
            138         VL_ADD_CLASS_MEMBER(Weight)
            139     VL_END_CLASS(Animal)
            140 
            141     VL_BEGIN_SUB_CLASS(Mammalian,Animal)
            142         VL_ADD_CLASS_MEMBER(FingerCount)
            143     VL_END_CLASS(Mammalian)
            144 
            145     VL_BEGIN_SUB_CLASS(Cat,Mammalian)
            146         VL_ADD_CLASS_MEMBER(BodyLength)
            147         VL_ADD_CLASS_MEMBER(TailLength)
            148     VL_END_CLASS(Cat)
            149 
            150     VL_BEGIN_SUB_CLASS(Fish,Animal)
            151         VL_ADD_CLASS_MEMBER(MaxDepth)
            152         VL_ADD_CLASS_MEMBER(Length)
            153     VL_END_CLASS(Fish)
            154 
            155     VL_BEGIN_SUB_CLASS(Bird,Animal)
            156         VL_ADD_CLASS_MEMBER(CanFly)
            157         VL_ADD_CLASS_MEMBER(Name)
            158     VL_END_CLASS(Bird)
            159 
            160     VL_BEGIN_SUB_CLASS(Human,Mammalian)
            161         VL_ADD_CLASS_MEMBER(Name)
            162         VL_ADD_CLASS_MEMBER(MainPat)
            163         VL_ADD_CLASS_MEMBER(MainTransportation)
            164         VL_ADD_CLASS_MEMBER(OtherPats)
            165         VL_ADD_CLASS_MEMBER(OtherTranspotations)
            166         VL_ADD_CLASS_MEMBER(OtherPatsList)
            167         VL_ADD_CLASS_MEMBER(OtherTranspotationsList)
            168         VL_ADD_CLASS_MEMBER(PatMap)
            169         VL_ADD_CLASS_MEMBER(PatMultiMap)
            170     VL_END_CLASS(Human)
            171 
            172     VL_BEGIN_INSPECTOR_MANAGER(AnimalManager)
            173         VL_BIND_INSPECTOR(Animal)
            174         VL_BIND_INSPECTOR(Mammalian)
            175         VL_BIND_INSPECTOR(Cat)
            176         VL_BIND_INSPECTOR(Fish)
            177         VL_BIND_INSPECTOR(Bird)
            178         VL_BIND_INSPECTOR(Human)
            179     VL_END_INSPECTOR_MANAGER
            180 
            181 VL_END_INSPECTOR_DECLARATION
            182 
            183 void PrintAnimal(VL_InspectorManager::Ptr Manager , Animal* aAnimal)
            184 {
            185     VL_InspectorConverterManager Converter;
            186     Converter.AddNormalConverter(new VL_InspectorReader);
            187 
            188     VL_ObjectInspector::Ptr Inspector=Manager->GetInspector(VL_InspectorSelector<Animal>::GetID());
            189     GetConsole()->WriteLine(Converter.FindToStringConverter(Inspector)->ConvertToString(Inspector,aAnimal));
            190 }
            191 
            192 void PrintType(VL_InspectorManager::Ptr Manager , VL_ObjectType::Ptr Type)
            193 {
            194     VL_InspectorConverterManager Converter;
            195     Converter.AddNormalConverter(new VL_InspectorReader);
            196 
            197     VL_ObjectInspector::Ptr Inspector=Manager->GetInspector(L"VL_ObjectType");
            198     GetConsole()->WriteLine(Converter.FindToStringConverter(Inspector)->ConvertToString(Inspector,Type.Object()));
            199 }
            200 
            201 void WriteHuman(VL_InspectorManager::Ptr Manager , Human& human , VUnicodeString FileName)
            202 {
            203     VL_XMLDocument XML;
            204     XML.GetRootElement()->SetName(L"objectxml");
            205     VL_ObjectXML XMLSerializer;
            206     XMLSerializer.Write(XML.GetRootElement(),Manager->GetInspector(L"Human"),&human);
            207 
            208     VL_FileStream XMLFile(FileName,VL_FileStream::vomWrite);
            209     XML.Save(&XMLFile,true);
            210 }
            211 
            212 VBool ReadHuman(VL_InspectorManager::Ptr Manager , Human& human , VUnicodeString FileName)
            213 {
            214     VL_XMLDocument XML;
            215     VL_FileStream XMLFile(FileName,VL_FileStream::vomRead);
            216     XML.Load(&XMLFile);
            217 
            218     Human NewHuman;
            219     VPointer Data=&NewHuman;
            220     try
            221     {
            222         VL_ObjectXML XMLSerializer;
            223         XMLSerializer.Read(Manager,XML.GetRootElement()->GetChildren()[0]->GetElement(),Data);
            224         return true;
            225     }
            226     catch(const VL_XMLError& Error)
            227     {
            228         GetConsole()->WriteLine(Error.Message);
            229         return false;
            230     }
            231 }
            232 
            233 void vlmain()
            234 {
            235     GetConsole()->SetTitle(L"Vczh Library++ 2.0 Type Information Test");
            236     GetConsole()->SetTestMemoryLeaks(true);
            237     GetConsole()->SetPauseOnExit(true);
            238     VUnicodeString WorkPath=VFileName(GetConsole()->GetAppPath()).MakeAbsolute(L"..\\TestFile\\").GetStrW();
            239 
            240     VL_FileStream LogStream(WorkPath+L"Console.txt",VL_FileStream::vomWrite);
            241     VL_StreamWriter LogWriter(vceUtf16,true,&LogStream);
            242     GetConsole()->SetLogger(&LogWriter);
            243 
            244     VL_InspectorManager::Ptr Manager=VL_GET_INSPECTOR_MANAGER(AnimalManager);
            245 
            246     Cat cat;
            247     Fish fish;
            248     Bird bird;
            249     Human human;
            250     PrintAnimal(Manager,&cat);
            251     PrintAnimal(Manager,&fish);
            252     PrintAnimal(Manager,&bird);
            253     PrintAnimal(Manager,&human);
            254 
            255     for(VInt i=0;i<Manager->GetInspectorCount();i++)
            256     {
            257         GetConsole()->Write(L"typeof("+Manager->GetInspector(i)->GetID()+L") = ");
            258         PrintType(Manager,Manager->GetInspector(i)->GetType());
            259     }
            260 
            261     GetConsole()->WriteLine(L"開始寫入");
            262     WriteHuman(Manager,human,WorkPath+L"Object.xml");
            263     Human NewHuman;
            264     GetConsole()->WriteLine(L"開始讀取");
            265     ReadHuman(Manager,NewHuman,WorkPath+L"Object.xml");
            266     GetConsole()->WriteLine(L"開始再次寫入");
            267     WriteHuman(Manager,NewHuman,WorkPath+L"Object2.xml");
            268 
            269     VL_FileStream StreamA(WorkPath+L"Object.xml",VL_FileStream::vomRead);
            270     VL_FileStream StreamB(WorkPath+L"Object2.xml",VL_FileStream::vomRead);
            271     if(ReadText(&StreamA)==ReadText(&StreamB))
            272     {
            273         GetConsole()->WriteLine(L"序列化成功!");
            274     }
            275     else
            276     {
            277         GetConsole()->WriteLine(L"序列化前后不一致。");
            278     }
            279 }

                于是這里是序列化的結果:
              1 <?xml version="1.0" encoding="gb2312" standalone="no"?>
              2 <objectxml>
              3   <struct typeid="Human">
              4     <member name="MainPat">
              5       <struct typeid="Cat">
              6         <member name="BodyLength">
              7           <basic typeid="VInt32s" value="40"/>
              8         </member>
              9         <member name="TailLength">
             10           <basic typeid="VInt32s" value="20"/>
             11         </member>
             12         <base typeid="Mammalian">
             13           <member name="FingerCount">
             14             <basic typeid="VInt32s" value="18"/>
             15           </member>
             16           <base typeid="Animal">
             17             <member name="Age">
             18               <basic typeid="VInt32s" value="5"/>
             19             </member>
             20             <member name="Weight">
             21               <basic typeid="VInt32s" value="150"/>
             22             </member>
             23           </base>
             24         </base>
             25       </struct>
             26     </member>
             27     <member name="MainTransportation">
             28       <struct typeid="Bird">
             29         <member name="CanFly">
             30           <basic typeid="VBool" value="true"/>
             31         </member>
             32         <member name="Name">
             33           <basic typeid="VUnicodeString" value="Red Dragon"/>
             34         </member>
             35         <base typeid="Animal">
             36           <member name="Age">
             37             <basic typeid="VInt32s" value="3000"/>
             38           </member>
             39           <member name="Weight">
             40             <basic typeid="VInt32s" value="300"/>
             41           </member>
             42         </base>
             43       </struct>
             44     </member>
             45     <member name="Name">
             46       <basic typeid="VUnicodeString" value="囧Smith"/>
             47     </member>
             48     <member name="OtherPats">
             49       <list typeid="VL_AutoPtr&lt;Animal&gt;[4]">
             50         <struct typeid="Cat">
             51           <member name="BodyLength">
             52             <basic typeid="VInt32s" value="50"/>
             53           </member>
             54           <member name="TailLength">
             55             <basic typeid="VInt32s" value="30"/>
             56           </member>
             57           <base typeid="Mammalian">
             58             <member name="FingerCount">
             59               <basic typeid="VInt32s" value="18"/>
             60             </member>
             61             <base typeid="Animal">
             62               <member name="Age">
             63                 <basic typeid="VInt32s" value="10"/>
             64               </member>
             65               <member name="Weight">
             66                 <basic typeid="VInt32s" value="100"/>
             67               </member>
             68             </base>
             69           </base>
             70         </struct>
             71         <struct typeid="Fish">
             72           <member name="Length">
             73             <basic typeid="VInt32s" value="25"/>
             74           </member>
             75           <member name="MaxDepth">
             76             <basic typeid="VDouble" value="3000.0"/>
             77           </member>
             78           <base typeid="Animal">
             79             <member name="Age">
             80               <basic typeid="VInt32s" value="20"/>
             81             </member>
             82             <member name="Weight">
             83               <basic typeid="VInt32s" value="200"/>
             84             </member>
             85           </base>
             86         </struct>
             87         <struct typeid="Bird">
             88           <member name="CanFly">
             89             <basic typeid="VBool" value="true"/>
             90           </member>
             91           <member name="Name">
             92             <basic typeid="VUnicodeString" value="Jack"/>
             93           </member>
             94           <base typeid="Animal">
             95             <member name="Age">
             96               <basic typeid="VInt32s" value="30"/>
             97             </member>
             98             <member name="Weight">
             99               <basic typeid="VInt32s" value="300"/>
            100             </member>
            101           </base>
            102         </struct>
            103         <null/>
            104       </list>
            105     </member>
            106     <member name="OtherPatsList">
            107       <list typeid="VL_List&lt;VL_AutoPtr&lt;Animal&gt; , false&gt;">
            108         <struct typeid="Cat">
            109           <member name="BodyLength">
            110             <basic typeid="VInt32s" value="50"/>
            111           </member>
            112           <member name="TailLength">
            113             <basic typeid="VInt32s" value="30"/>
            114           </member>
            115           <base typeid="Mammalian">
            116             <member name="FingerCount">
            117               <basic typeid="VInt32s" value="18"/>
            118             </member>
            119             <base typeid="Animal">
            120               <member name="Age">
            121                 <basic typeid="VInt32s" value="10"/>
            122               </member>
            123               <member name="Weight">
            124                 <basic typeid="VInt32s" value="100"/>
            125               </member>
            126             </base>
            127           </base>
            128         </struct>
            129         <struct typeid="Fish">
            130           <member name="Length">
            131             <basic typeid="VInt32s" value="25"/>
            132           </member>
            133           <member name="MaxDepth">
            134             <basic typeid="VDouble" value="3000.0"/>
            135           </member>
            136           <base typeid="Animal">
            137             <member name="Age">
            138               <basic typeid="VInt32s" value="20"/>
            139             </member>
            140             <member name="Weight">
            141               <basic typeid="VInt32s" value="200"/>
            142             </member>
            143           </base>
            144         </struct>
            145         <struct typeid="Bird">
            146           <member name="CanFly">
            147             <basic typeid="VBool" value="true"/>
            148           </member>
            149           <member name="Name">
            150             <basic typeid="VUnicodeString" value="Jack"/>
            151           </member>
            152           <base typeid="Animal">
            153             <member name="Age">
            154               <basic typeid="VInt32s" value="30"/>
            155             </member>
            156             <member name="Weight">
            157               <basic typeid="VInt32s" value="300"/>
            158             </member>
            159           </base>
            160         </struct>
            161       </list>
            162     </member>
            163     <member name="OtherTranspotations">
            164       <list typeid="Bird[3]">
            165         <struct typeid="Bird">
            166           <member name="CanFly">
            167             <basic typeid="VBool" value="true"/>
            168           </member>
            169           <member name="Name">
            170             <basic typeid="VUnicodeString" value="Blue Dragon 1"/>
            171           </member>
            172           <base typeid="Animal">
            173             <member name="Age">
            174               <basic typeid="VInt32s" value="3000"/>
            175             </member>
            176             <member name="Weight">
            177               <basic typeid="VInt32s" value="300"/>
            178             </member>
            179           </base>
            180         </struct>
            181         <struct typeid="Bird">
            182           <member name="CanFly">
            183             <basic typeid="VBool" value="true"/>
            184           </member>
            185           <member name="Name">
            186             <basic typeid="VUnicodeString" value="Blue Dragon 2"/>
            187           </member>
            188           <base typeid="Animal">
            189             <member name="Age">
            190               <basic typeid="VInt32s" value="3100"/>
            191             </member>
            192             <member name="Weight">
            193               <basic typeid="VInt32s" value="300"/>
            194             </member>
            195           </base>
            196         </struct>
            197         <struct typeid="Bird">
            198           <member name="CanFly">
            199             <basic typeid="VBool" value="true"/>
            200           </member>
            201           <member name="Name">
            202             <basic typeid="VUnicodeString" value="Blue Dragon 3"/>
            203           </member>
            204           <base typeid="Animal">
            205             <member name="Age">
            206               <basic typeid="VInt32s" value="3200"/>
            207             </member>
            208             <member name="Weight">
            209               <basic typeid="VInt32s" value="300"/>
            210             </member>
            211           </base>
            212         </struct>
            213       </list>
            214     </member>
            215     <member name="OtherTranspotationsList">
            216       <list typeid="VL_List&lt;Bird , false&gt;">
            217         <struct typeid="Bird">
            218           <member name="CanFly">
            219             <basic typeid="VBool" value="true"/>
            220           </member>
            221           <member name="Name">
            222             <basic typeid="VUnicodeString" value="Green Dragon 1"/>
            223           </member>
            224           <base typeid="Animal">
            225             <member name="Age">
            226               <basic typeid="VInt32s" value="3000"/>
            227             </member>
            228             <member name="Weight">
            229               <basic typeid="VInt32s" value="300"/>
            230             </member>
            231           </base>
            232         </struct>
            233         <struct typeid="Bird">
            234           <member name="CanFly">
            235             <basic typeid="VBool" value="true"/>
            236           </member>
            237           <member name="Name">
            238             <basic typeid="VUnicodeString" value="Green Dragon 2"/>
            239           </member>
            240           <base typeid="Animal">
            241             <member name="Age">
            242               <basic typeid="VInt32s" value="3010"/>
            243             </member>
            244             <member name="Weight">
            245               <basic typeid="VInt32s" value="300"/>
            246             </member>
            247           </base>
            248         </struct>
            249         <struct typeid="Bird">
            250           <member name="CanFly">
            251             <basic typeid="VBool" value="true"/>
            252           </member>
            253           <member name="Name">
            254             <basic typeid="VUnicodeString" value="Green Dragon 3"/>
            255           </member>
            256           <base typeid="Animal">
            257             <member name="Age">
            258               <basic typeid="VInt32s" value="3020"/>
            259             </member>
            260             <member name="Weight">
            261               <basic typeid="VInt32s" value="300"/>
            262             </member>
            263           </base>
            264         </struct>
            265       </list>
            266     </member>
            267     <member name="PatMap">
            268       <map typeid="VL_ListedMap&lt;VUnicodeString , VL_AutoPtr&lt;Animal&gt;&gt;">
            269         <pair>
            270           <key>
            271             <basic typeid="VUnicodeString" value="Bird"/>
            272           </key>
            273           <value>
            274             <struct typeid="Bird">
            275               <member name="CanFly">
            276                 <basic typeid="VBool" value="true"/>
            277               </member>
            278               <member name="Name">
            279                 <basic typeid="VUnicodeString" value="Jack"/>
            280               </member>
            281               <base typeid="Animal">
            282                 <member name="Age">
            283                   <basic typeid="VInt32s" value="30"/>
            284                 </member>
            285                 <member name="Weight">
            286                   <basic typeid="VInt32s" value="300"/>
            287                 </member>
            288               </base>
            289             </struct>
            290           </value>
            291         </pair>
            292         <pair>
            293           <key>
            294             <basic typeid="VUnicodeString" value="Cat"/>
            295           </key>
            296           <value>
            297             <struct typeid="Cat">
            298               <member name="BodyLength">
            299                 <basic typeid="VInt32s" value="50"/>
            300               </member>
            301               <member name="TailLength">
            302                 <basic typeid="VInt32s" value="30"/>
            303               </member>
            304               <base typeid="Mammalian">
            305                 <member name="FingerCount">
            306                   <basic typeid="VInt32s" value="18"/>
            307                 </member>
            308                 <base typeid="Animal">
            309                   <member name="Age">
            310                     <basic typeid="VInt32s" value="10"/>
            311                   </member>
            312                   <member name="Weight">
            313                     <basic typeid="VInt32s" value="100"/>
            314                   </member>
            315                 </base>
            316               </base>
            317             </struct>
            318           </value>
            319         </pair>
            320         <pair>
            321           <key>
            322             <basic typeid="VUnicodeString" value="Fish"/>
            323           </key>
            324           <value>
            325             <struct typeid="Fish">
            326               <member name="Length">
            327                 <basic typeid="VInt32s" value="25"/>
            328               </member>
            329               <member name="MaxDepth">
            330                 <basic typeid="VDouble" value="3000.0"/>
            331               </member>
            332               <base typeid="Animal">
            333                 <member name="Age">
            334                   <basic typeid="VInt32s" value="20"/>
            335                 </member>
            336                 <member name="Weight">
            337                   <basic typeid="VInt32s" value="200"/>
            338                 </member>
            339               </base>
            340             </struct>
            341           </value>
            342         </pair>
            343       </map>
            344     </member>
            345     <member name="PatMultiMap">
            346       <map typeid="VL_MultiMap&lt;VUnicodeString , VL_AutoPtr&lt;Animal&gt; , false&gt;">
            347         <pair>
            348           <key>
            349             <basic typeid="VUnicodeString" value="A"/>
            350           </key>
            351           <value>
            352             <list typeid="VL_List&lt;VL_AutoPtr&lt;Animal&gt; , false&gt;">
            353               <struct typeid="Cat">
            354                 <member name="BodyLength">
            355                   <basic typeid="VInt32s" value="50"/>
            356                 </member>
            357                 <member name="TailLength">
            358                   <basic typeid="VInt32s" value="30"/>
            359                 </member>
            360                 <base typeid="Mammalian">
            361                   <member name="FingerCount">
            362                     <basic typeid="VInt32s" value="18"/>
            363                   </member>
            364                   <base typeid="Animal">
            365                     <member name="Age">
            366                       <basic typeid="VInt32s" value="10"/>
            367                     </member>
            368                     <member name="Weight">
            369                       <basic typeid="VInt32s" value="100"/>
            370                     </member>
            371                   </base>
            372                 </base>
            373               </struct>
            374               <struct typeid="Fish">
            375                 <member name="Length">
            376                   <basic typeid="VInt32s" value="25"/>
            377                 </member>
            378                 <member name="MaxDepth">
            379                   <basic typeid="VDouble" value="3000.0"/>
            380                 </member>
            381                 <base typeid="Animal">
            382                   <member name="Age">
            383                     <basic typeid="VInt32s" value="20"/>
            384                   </member>
            385                   <member name="Weight">
            386                     <basic typeid="VInt32s" value="200"/>
            387                   </member>
            388                 </base>
            389               </struct>
            390             </list>
            391           </value>
            392         </pair>
            393         <pair>
            394           <key>
            395             <basic typeid="VUnicodeString" value="B"/>
            396           </key>
            397           <value>
            398             <list typeid="VL_List&lt;VL_AutoPtr&lt;Animal&gt; , false&gt;">
            399               <struct typeid="Bird">
            400                 <member name="CanFly">
            401                   <basic typeid="VBool" value="true"/>
            402                 </member>
            403                 <member name="Name">
            404                   <basic typeid="VUnicodeString" value="Jack"/>
            405                 </member>
            406                 <base typeid="Animal">
            407                   <member name="Age">
            408                     <basic typeid="VInt32s" value="30"/>
            409                   </member>
            410                   <member name="Weight">
            411                     <basic typeid="VInt32s" value="300"/>
            412                   </member>
            413                 </base>
            414               </struct>
            415             </list>
            416           </value>
            417         </pair>
            418       </map>
            419     </member>
            420     <base typeid="Mammalian">
            421       <member name="FingerCount">
            422         <basic typeid="VInt32s" value="20"/>
            423       </member>
            424       <base typeid="Animal">
            425         <member name="Age">
            426           <basic typeid="VInt32s" value="16"/>
            427         </member>
            428         <member name="Weight">
            429           <basic typeid="VInt32s" value="2000"/>
            430         </member>
            431       </base>
            432     </base>
            433   </struct>
            434 </objectxml>
            posted on 2009-06-28 20:12 陳梓瀚(vczh) 閱讀(6495) 評論(10)  編輯 收藏 引用 所屬分類: C++

            評論:
            # re: C++基于類似反射機制的XML序列化和反序列化完成 2009-06-28 23:05 | 尹東斐
            這實現看起來很有誘惑力 :0

            有點不太懂,請指教:

            136 VL_BEGIN_BASE_CLASS(Animal)
            137 VL_ADD_CLASS_MEMBER(Age)
            138 VL_ADD_CLASS_MEMBER(Weight)
            139 VL_END_CLASS(Animal)

            在VL_ADD_CLASS_MEMBER的時候,沒有涉及到成員的類型,那么當讀取數據的時候,類型是怎么得到的?

            GetConsole()->WriteLine(Converter.FindToStringConverter(Inspector)->ConvertToString(Inspector,Type.Object()));

            你在這里用到了Type.Object(),我想問你是不是把所有類型都包裝起來了,相當于每個類型都有個get_type()之類的方法,如果你是這么實現的,那就沒有問題了。如果不是的話,

            197 VL_ObjectInspector::Ptr Inspector=Manager->GetInspector(L"VL_ObjectType");

            188 VL_ObjectInspector::Ptr Inspector=Manager->GetInspector(VL_InspectorSelector<Animal>::GetID());

            我想這兩句的作用應該是一樣的,只不過VL_InspectorSelector<Animal>是在宏里面特化的,L"VL_ObjectType"是你為所有“內建”類型寫的。

            難道Inspector里面包含有每個成員的類型?
              回復  更多評論
              
            # re: C++基于類似反射機制的XML序列化和反序列化完成 2009-06-28 23:47 | 陳梓瀚(vczh)
            @尹東斐
            1:Type是智能指針,Type.Object用于獲得那個真實的指針,你看錯了。
            2:VL_ADD_CLASS_MEMBER(Weight)可以得到Weight的類型,這個用模板就可以了。
            3:Inspector里面包含了每一個直接或間接注冊的類型的所有信息,完全可以只適用Inspector來修改對象里面的內容。這一點是XML Serializer讀寫的基礎。  回復  更多評論
              
            # re: C++基于類似反射機制的XML序列化和反序列化完成 2009-06-28 23:54 | 陳梓瀚(vczh)
            @尹東斐
            等我連通過反射調用函數的東西做完之后,會有一個Demo的。暫定為服務器使用http協議將一個C++類掛起來,然后有一個客戶端去調用它。就跟現在的web service差不多,當然我并不使用那個協議。  回復  更多評論
              
            # re: C++基于類似反射機制的XML序列化和反序列化完成 2009-06-29 00:43 | 尹東斐
            @陳梓瀚(vczh)

            >>VL_ADD_CLASS_MEMBER(Weight)可以得到Weight的類型,這個用模板就可以了。

            這個用模板也做不到吧? 除非有typeof之類的操作符,否則拿不到類型的呀。  回復  更多評論
              
            # re: C++基于類似反射機制的XML序列化和反序列化完成 2009-06-29 00:48 | 尹東斐
            比如:
            class A
            {
            public:
            int i;
            };

            VL_BEGIN_INSPECTOR_DECLARATION
            VL_BEGIN_BASE_CLASS(A)
            VL_ADD_CLASS_MEMBER(i)
            VL_END_CLASS(A)
            VL_END_INSPECTOR_DECLARATION

            A a;

            現在我要通過類似 int x = func(a, "i"); 來的到a中i的值,那這個時候,怎么知道i的類型呢?也就是說func的返回值是從哪里來的?

            不吝賜教~  回復  更多評論
              
            # re: C++基于類似反射機制的XML序列化和反序列化完成 2009-06-29 05:06 | 陳梓瀚(vczh)
            @尹東斐
            有一種東西叫模板函數,函數里面不就拿得到類型了么。這個時候送進模板類去搞特化。  回復  更多評論
              
            # re: C++基于類似反射機制的XML序列化和反序列化完成 2009-06-29 05:08 | 陳梓瀚(vczh)
            @尹東斐
            而且Inspector返回的是指針,然后有各種各樣的辦法來告訴你這個東西是個int,讓你用合適的方法去拿。  回復  更多評論
              
            # re: C++基于類似反射機制的XML序列化和反序列化完成 2009-06-29 19:21 | yindf
            @陳梓瀚(vczh)

            謝謝  回復  更多評論
              
            # re: C++基于類似反射機制的XML序列化和反序列化完成 2009-06-29 23:34 | 陳昱(CY)
            是不是VL_BEGIN_BASE_CLASS的話,VL_ADD_CLASS_MEMBER里面的內容類型一定要C++的基本類型?這樣對所有基本類型都進行特化?  回復  更多評論
              
            # re: C++基于類似反射機制的XML序列化和反序列化完成 2009-06-30 08:08 | 陳梓瀚(vczh)
            @陳昱(CY)
            背后預定義了很多已經存在的基本類型和很多容器等等。你也可以用相同的辦法擴展成支持STL的。  回復  更多評論
              
            亚洲国产精品高清久久久| 亚洲国产精品综合久久网络| 日韩欧美亚洲综合久久影院Ds| 久久久久成人精品无码中文字幕 | 一级做a爰片久久毛片看看| 久久国产一区二区| 久久久无码精品亚洲日韩按摩 | 色婷婷综合久久久久中文字幕 | 亚洲一本综合久久| 久久国产精品久久| 久久免费精品一区二区| 久久免费线看线看| 91精品国产高清久久久久久91| 996久久国产精品线观看| 久久精品中文字幕无码绿巨人| 久久久久久久亚洲Av无码| 久久精品国产亚洲精品2020| 亚洲国产精品久久久天堂| 国产精品国色综合久久| 精品国产乱码久久久久久郑州公司 | 久久精品国产国产精品四凭| 99久久亚洲综合精品成人| 91久久国产视频| 久久久艹| 久久受www免费人成_看片中文| 久久无码高潮喷水| 亚洲va久久久噜噜噜久久| 精品久久久久久久无码 | 一级做a爰片久久毛片看看 | 国产Av激情久久无码天堂| 欧美va久久久噜噜噜久久| 国产91色综合久久免费分享| 一本伊大人香蕉久久网手机| 久久不见久久见免费影院www日本| 久久综合伊人77777麻豆| 99久久精品免费看国产一区二区三区| 久久亚洲精品成人av无码网站| 777久久精品一区二区三区无码| 久久久久国产精品三级网| 亚洲精品无码久久久久sm| 日韩精品久久久久久|