XML序列化数据对象(一)
struct STState
{
double m_dPosition;
std::string m_strMemberName;
double m_dTemperature;
};
STState stState;
假设某程序有stState这么一个数据对象, 需要对这个对象进行存储, 对数据对象存储就是序列化了.
1. MFC中按照MFC的规则可以对对象进行序列化.(通过宏, 好像, 因为很少用MFC的序列化.).
MFC的这种序列化有两个序列化函数, 一个负责写入文件, 一个负责读取文件. 而MFC这种序列化变量的存储是有顺序的, 读写两个函数必须要对应.
2. Boost库实现对象的序列化.
Boost中通过模板实现, 每一个需要实现序列化的数据对象的类需要实现一个序列化模板函数.
看这两篇文章的说明
http://blog.csdn.net/cay22/article/details/4386250
http://blog.csdn.net/cay22/article/details/4386394
3. 自己写代码.
也可以自己生成XML文件来存储数据对象, 当然也是写一个写入文件的函数和写一个读取文件的函数. 如果数据结构的结构改变了, 这两个函数也是需要修改的, 改动比较大的时候很容易错误; 如果有10个数据结构, 就要有20个解析过程(读写各10个), 对着这20个解析过程, 你可能会疯掉.(我也做过这样的事情!!!!!!!!!!!!!!!!!!!!!!!!!!!).
虽然解析各个数据结构的解析过程都不同, 但是读写XML的流程是一致的. 所以为什么boost使用模板函数做序列化处理的原因.
万变不离其中(模板就是在代码层的上一层编程). 我自己写序列化的代码也是在代码层的上一层编程, 但不是通过模板. 而是通过写一个程序, 这个程序根据数据结构的结构自动生成写文件函数和读文件函数代码. 生成代码后重新编译程序即可. 与使用模板有相似之处.
(我不知道这么做与使用模板谁好谁差, 只是想实现一些自己的想法. 但这想法可能把事情复杂化, 同时生成的一些代码也的确对自己的工作加快了).
(把一些机械化和习惯性的工作固化到你的程序中可以尽量的减少犯错误和可以提高工作效率)
MFC和boost的方法都是很方便的, 如果数据结构改变, 只需要修改序列化函数重新编译即可(修改的地方只有一处, 大大减少犯错误的机会).
4. 如何实现XML序列化数据对象(我自己的做法)
4.1 定义对象类型, 使用XML保存
例如: <basetype name = "int"></basetype>, 还有很多种类型
4.2 有了XML格式存储的类型, 数据对象的XML格式也可以确定下来, 后面怎么弄都行了.