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

隨筆-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) 閱讀(6533) 評論(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的。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲男女自偷自拍图片另类| 日韩一级黄色大片| 狠狠色狠狠色综合| 狠狠色2019综合网| 狠狠色伊人亚洲综合网站色| 国内精品美女av在线播放| 国产一区在线看| 在线观看欧美亚洲| 91久久国产精品91久久性色| 亚洲精品一区中文| 一区二区黄色| 午夜精品免费在线| 久久久久久久999| 美日韩精品免费观看视频| 美女亚洲精品| 亚洲精品美女91| 一区二区福利| 亚洲欧洲av一区二区三区久久| 久久精品国产亚洲aⅴ| 久久资源在线| 欧美另类变人与禽xxxxx| 欧美日韩综合在线| 国产在线成人| 亚洲人成网站777色婷婷| 一区二区三区视频免费在线观看| 亚洲欧美成人| 久久久免费观看视频| 亚洲第一福利视频| 亚洲网址在线| 麻豆精品传媒视频| 欧美日韩在线免费视频| 国产欧美欧美| 日韩午夜一区| 久久精品网址| 亚洲日本欧美在线| 欧美一区二区视频免费观看| 另类av导航| 国产精品乱人伦中文| 精品动漫3d一区二区三区免费版| 亚洲精品综合久久中文字幕| 午夜久久影院| 亚洲国产日韩在线一区模特| 亚洲女性喷水在线观看一区| 美女日韩欧美| 国产欧美精品久久| 日韩香蕉视频| 久久人人爽人人爽| av成人国产| 免费欧美高清视频| 国产模特精品视频久久久久| 亚洲人精品午夜| 欧美与欧洲交xxxx免费观看 | 亚洲伊人一本大道中文字幕| 久久精品亚洲一区二区| 欧美日韩午夜在线| 尤物精品在线| 亚洲综合好骚| 亚洲第一区在线观看| 午夜精品视频| 欧美深夜福利| 亚洲日本视频| 榴莲视频成人在线观看| 亚洲视频播放| 欧美日韩另类一区| 伊人成人开心激情综合网| 亚洲主播在线| 亚洲经典三级| 久久这里有精品15一区二区三区 | 一本色道久久综合亚洲精品按摩 | 美女诱惑黄网站一区| 亚洲小视频在线| 欧美精品亚洲| 亚洲国产精品久久久久婷婷884 | 欧美在线高清视频| 国产精品红桃| 亚洲午夜精品网| 亚洲国产免费| 另类综合日韩欧美亚洲| 国产亚洲欧美aaaa| 午夜视频精品| 亚洲午夜精品在线| 欧美视频免费看| 夜夜嗨av一区二区三区四季av | 国产综合视频在线观看| 亚洲欧美亚洲| 亚洲一级高清| 欧美高清视频| 夜夜嗨av色一区二区不卡| 久久亚洲精选| 午夜精品久久久久| 欧美色播在线播放| 中日韩高清电影网| 亚洲国产精品一区二区尤物区| 久久精品91久久香蕉加勒比 | 精品成人一区二区三区| 久久九九免费| 欧美在线一区二区三区| 国产欧美一区二区三区沐欲 | 欧美视频在线观看一区| 亚洲色诱最新| 亚洲黄色影院| 久久精品国产精品亚洲精品| 国产精品揄拍500视频| 午夜精品一区二区三区在线播放 | 亚洲国产高清高潮精品美女| 美国十次成人| 亚洲激情成人在线| 亚洲日本va午夜在线电影| 欧美成人国产| 亚洲美女诱惑| 亚洲美女中文字幕| 欧美亚一区二区| 欧美亚洲视频| 久久99在线观看| 在线免费日韩片| 欧美激情国产日韩精品一区18| 久久婷婷综合激情| 91久久视频| 日韩一级大片在线| 国产精品亚洲片夜色在线| 久久久久久久成人| 老巨人导航500精品| 亚洲精品一区二区三| 日韩午夜激情| 国产丝袜美腿一区二区三区| 狼人天天伊人久久| 欧美电影在线免费观看网站 | 亚洲人成绝费网站色www| 欧美日韩一区二区三区四区在线观看 | 欧美成人午夜剧场免费观看| 欧美国产日韩一区二区| 亚洲深夜福利视频| 欧美在线观看一二区| 91久久精品美女高潮| 一本色道久久综合亚洲精品婷婷 | 国产欧美日本一区视频| 麻豆精品视频在线观看视频| 欧美精品乱码久久久久久按摩| 亚洲永久免费av| 久久亚洲视频| 亚洲在线中文字幕| 久久精品中文字幕一区| 一区二区高清视频在线观看| 欧美综合77777色婷婷| 一区二区三区国产| 欧美一区二区视频观看视频| 日韩视频在线观看免费| 亚洲欧美日韩综合国产aⅴ | 欧美激情久久久久久| 国产精品二区在线| 免费毛片一区二区三区久久久| 欧美日韩国产成人在线免费| 久久人人97超碰国产公开结果| 欧美精品一区二区蜜臀亚洲| 久久久久久欧美| 欧美三级在线视频| 欧美va天堂va视频va在线| 国产精品久久久久久久久动漫| 美女91精品| 国产精品乱码一区二区三区| 欧美激情一区二区三区全黄 | 久久久九九九九| 欧美日韩国内自拍| 免费观看成人| 国产九九精品视频| 99精品国产在热久久| 亚洲大黄网站| 欧美一区二区三区免费视频| 一区二区三区www| 久久综合中文字幕| 欧美在线观看网站| 欧美视频一区二区三区| 亚洲国产精品久久久久婷婷884| 国产午夜精品福利| 亚洲视频综合在线| 99精品国产在热久久下载| 久久亚洲精品欧美| 久久精品国产欧美亚洲人人爽| 国产精品s色| 亚洲精品一区二区在线| 亚洲第一伊人| 欧美在线国产精品| 欧美在线视频一区二区三区| 国产精品va在线| 亚洲麻豆一区| 日韩一级黄色av| 欧美寡妇偷汉性猛交| 欧美国产精品人人做人人爱| 在线不卡欧美| 久久久久国产一区二区三区四区| 欧美一区二区精品久久911| 欧美日韩中文字幕在线| 日韩手机在线导航| 一区二区久久| 欧美日韩精品高清| 亚洲精品少妇| 亚洲一区二区三区四区五区黄 | 99re66热这里只有精品3直播 | 久久久久久久999精品视频| 久久久国际精品|