龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

我做的一个C++用的Serialization库(含部分源码)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
众所周知,boost里面有一个Serialization。不过我这个跟boost的有本质上的差别。boost的Serialization是通过重载操作符将一个对象与一个流进行读写,而我则通过记录类的成员变量来自动产生

  众所周知,boost里面有一个Serialization。不过我这个跟boost的有本质上的差别。boost的Serialization是通过重载操作符将一个对象与一个流进行读写,而我则通过记录类的成员变量来自动产生相应的读写动作。

  不过我的Serialization库有两个缺点,就是效率不是特别高,因为我产生的是可以与XML进行互相转换的通用对象。虽然这并不是必需的,只是我的个人爱好罢了。第二个缺点是Serialization会产生侵入式的代码。使用方法如下:

  首先改造需要被Serialize的类,使之成为一个Serializable Object:

1 class TestTree : public VL_SerializableObject

2 {

3 public:

4   VInt          IntegerMember;

5   VUnicodeString      StringMember;

6   VL_AutoPtr  LeftTree;

7   VL_AutoPtr  RightTree;

8

9   TestTree()

10   {

11     VL_REGISTER_SERIALIZABLE_FIELD(TestTree,IntegerMember);

12     VL_REGISTER_SERIALIZABLE_FIELD(TestTree,StringMember);

13     VL_REGISTER_SERIALIZABLE_FIELD(TestTree,LeftTree);

14     VL_REGISTER_SERIALIZABLE_FIELD(TestTree,RightTree);

15   }

16 };

  其次构造一个VL_Serializer并对这个类进行注册:

1 VL_Serializer Serializer;

2 VL_REGISTER_SERIALIZABLE_CLASS(&Serializer,TestTree);

  完成了!现在可以尝试将一个对象通过Serializer转换成XML:

1 VL_AutoPtr Root=new TestTree;

2 Root->IntegerMember=10;

3 Root->StringMember=L"Root";

4

5 VL_AutoPtr Left=new TestTree;

6 Left->IntegerMember=20;

7 Left->StringMember=L"Left";

8

9 VL_AutoPtr Right=new TestTree;

10 Right->IntegerMember=30;

11 Right->StringMember=L"Right";

12

13 Root->LeftTree=Left;

14 Root->RightTree=Right;

15

16 VL_CommonObject SerializedObject=Serializer.Serialize(Root.Object());

17 VL_XMLDocument Document;

18 Document.GetRootElement()->SetName(L"SerializedObject");

19 SerializedObject.SaveToXML(Document.GetRootElement());

20 VL_FileStream Stream(FileName,VL_FileStream::vfomWrite);

21 Document.Save(&Stream,true);

精彩图集

赞助商链接