XML序列化数据对象(三)

前端之家收集整理的这篇文章主要介绍了XML序列化数据对象(三)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

XML序列化数据对象@H_404_3@(@H_404_3@三)---实现@H_404_3@@H_404_3@


@H_404_3@@H_404_3@

一.实现界面


1.1大致界面@H_404_3@



图1


1.2类类型@H_404_3@



图2


1.3变量输入@H_404_3@



图3


二.使用步骤


2.1添加一些类@H_404_3@


@H_404_3@


图4


2.2添加一些变量@H_404_3@


@H_404_3@


图5


2.3可以保存类型和变量为@H_404_3@xml@H_404_3@文件@H_404_3@


添加了类型和变量后,@H_404_3@这些数据可以保存为@H_404_3@xml@H_404_3@文件@H_404_3@(@H_404_3@例如@H_404_3@aa.xml),@H_404_3@也可以重新加载这个@H_404_3@XML@H_404_3@文件@H_404_3@,@H_404_3@方便以后修改使用@H_404_3@.@H_404_3@

假设CTest@H_404_3@类的结构变化了@H_404_3@,@H_404_3@那么序列化@H_404_3@/@H_404_3@反序列化的代码也就需要改变了@H_404_3@,@H_404_3@你可以重新加载@H_404_3@aa.xml@H_404_3@对@H_404_3@CTest@H_404_3@的结构修改@H_404_3@,@H_404_3@然后再次生成序列化@H_404_3@/@H_404_3@反序列化代码即可@H_404_3@.@H_404_3@

aa.xml文件@H_404_3@:@H_404_3@

<structure_def>
	<class name = "CTest">
		<include file = "a" sys = "0">
		</include>
		<include file = "b" sys = "1">
		</include>
	</class>
	<basetype name = "int">
	</basetype>
	<basetype name = "double">
	</basetype>
	<basetype name = "long">
	</basetype>
	<stltype name = "std::vector" typenamecount = "1">
	</stltype>
	<stltemplate beptr = "0" beptr1 = "0" name = "IntVector" type = "std::vector" typename1 = "int">
	</stltemplate>
	<ClassObject>
		<m_nA class = "int">
		</m_nA>
		<m_dB class = "double">
		</m_dB>
		<m_intVector class = "IntVector">
		</m_intVector>
	</ClassObject>
</structure_def>

2.4生成序列化@H_404_3@/@H_404_3@反序列化的代码@H_404_3@

#pragma once
// 这里include你自己的头文件

// 序列化
class CHYSerialization
{
public:
	CHYSerialization();
	~CHYSerialization();
	bool SerializationOpen(const std::string& strFileName);
	bool SerializationClose();

	// 基本类型的序列化
	bool SerializationClassType_int(CHYMLItem* pCHYMLItemParent,const std::string& strObjectName,const int& nValue);
	bool SerializationClassType_long(CHYMLItem* pCHYMLItemParent,const long& lValue);
	bool SerializationClassType_double(CHYMLItem* pCHYMLItemParent,const double& dValue);
	bool SerializationClassType_float(CHYMLItem* pCHYMLItemParent,const float& fValue);
	bool SerializationClassType_char(CHYMLItem* pCHYMLItemParent,const char& chValue);
	bool SerializationClassType_string(CHYMLItem* pCHYMLItemParent,const std::string& strValue);

	// 用户定义的类/结构体等类型的序列化
	bool SerializationClassType_CTest(CHYMLItem* pCHYMLItemParent,const CTest& refValue);
	bool SerializationClassType_IntVector(CHYMLItem* pCHYMLItemParent,const IntVector& refValue);

	// 变量的序列化函数
	bool SerializationObject_m_nA(const int& refValue);
	bool SerializationObject_m_dB(const double& refValue);
	bool SerializationObject_m_intVector(const IntVector& refValue);
private:
	CHYML m_hyML;					// 你使用的XML解析库相关变量
	CHYMLParser m_hyMLParser;
	CHYMLItem* m_pCHYMLItemParent;
	std::string m_strFileName;
};

// 反序列化
class CHYReSerialization
...

// Cpp文件代码很长
...


以上这些代码都是自动生成的,随类型结构的变化而变化@H_404_3@.@H_404_3@

以后要序列化某类型的变量,@H_404_3@可以简单的生成这些代码即可@H_404_3@.@H_404_3@

h@H_404_3@文件和@H_404_3@cpp@H_404_3@文件加入到你的工程即可@H_404_3@.@H_404_3@


@H_404_3@

2.5序列化@H_404_3@/@H_404_3@反序列化的代码的使用@H_404_3@


变量m_nA,m_dB,m_intVector本身就是你的工程里面需要才添加代码生成器的.

序列化:@H_404_3@

// 你工程里的变量是这样的
int m_nA = 5;
double m_dB = 5.9;
IntVector m_intVector;
m_intVector.push_back(1);
m_intVector.push_back(3);
m_intVector.push_back(4);
m_intVector.push_back(7);
....
// 序列化
CHYSerialization hySerialization;
hySerialization.SerializationOpen("C:\ss.xml");	 // 变量的序列化信息保存在ss.xml文件中
// 序列化这3个变量
hySerialization.SerializationObject_m_nA(m_nA);
hySerialization.SerializationObject_m_dB(m_dB);
hySerialization.SerializationObject_m_intVector(m_intVector);
hySerialization.SerializationClose();

生成的变量的序列化信息ss.xml文件是@H_404_3@

<ObjectSerialization>
	<m_nA class = "int">
		5
	</m_nA>
	<m_dB class = "double">
		5.900000
	</m_dB>
	<m_intVector class = "IntVector">
		<vectorItem0 class = "int">
			1
		</vectorItem0>
		<vectorItem1 class = "int">
			3
		</vectorItem1>
		<vectorItem2 class = "int">
			4
		</vectorItem2>
		<vectorItem3 class = "int">
			7
		</vectorItem3>
	</m_intVector>
</ObjectSerialization>

反序列化:@H_404_3@

CHYReSerialization hyReSerialization;
hyReSerialization.ReSerializationOpen("C:\ss.xml");
hyReSerialization.ReSerializationObject_m_nA(m_nA);
hyReSerialization.ReSerializationObject_m_dB(m_dB);
hyReSerialization.ReSerializationObject_m_intVector(m_intVector);
hyReSerialization.ReSerializationClose();


初步使用了一下,@H_404_3@效果还可以@H_404_3@.@H_404_3@


@H_404_3@

三.总结


3.1这样自动生成序列化@H_404_3@/@H_404_3@反序列化的代码使用起来的确比较方便@H_404_3@,@H_404_3@但是也有繁琐的地方@H_404_3@,@H_404_3@例如生成代码后@H_404_3@,@H_404_3@还要把@H_404_3@h@H_404_3@文件和@H_404_3@cpp@H_404_3@文件拷贝到自己的工程@H_404_3@,@H_404_3@还要在@H_404_3@h@H_404_3@文件添加相关的头文件@H_404_3@(@H_404_3@你的类头文件@H_404_3@).@H_404_3@对比@H_404_3@boost@H_404_3@库@H_404_3@,@H_404_3@只需要些相关的模板代码代码就可以了@H_404_3@.@H_404_3@反正就是没有boost@H_404_3@库方便@H_404_3@.@H_404_3@@H_404_3@


3.2添加类类型的处理非常非常的繁琐和乱@H_404_3@,@H_404_3@因为类型很多@H_404_3@(basetype,stltype,struct,class,stltemplate,typedef),@H_404_3@还有很多判断条件@H_404_3@,@H_404_3@这些判断我是通过界面交互来处理的@H_404_3@,@H_404_3@可能还有很多没有考虑到的地方@H_404_3@.@H_404_3@可惜自己不懂@H_404_3@C++@H_404_3@的语法分析@H_404_3@,@H_404_3@通过语法分析@H_404_3@,@H_404_3@就很容易分析出这些类型@H_404_3@,@H_404_3@而且更强大@H_404_3@.@H_404_3@


@H_404_3@

3.3设计成类似@H_404_3@boost@H_404_3@库那样序列化的操作方式是不是更好@H_404_3@?@H_404_3@


@H_404_3@

3.4代码代码需要在更高一层上想问题@H_404_3@.@H_404_3@平时写代码@H_404_3@,@H_404_3@你直接把代码写入对应的@H_404_3@cpp/h@H_404_3@文件@H_404_3@,@H_404_3@然后编译@H_404_3@,@H_404_3@看是否有语法错误@H_404_3@,@H_404_3@编译通过了@H_404_3@,@H_404_3@就运行看有没有运行上@H_404_3@/@H_404_3@逻辑上的错误@H_404_3@;@H_404_3@代码代码还要加多一层@H_404_3@,@H_404_3@就是你先确保生成代码的程序@H_404_3@(@H_404_3@代码生成器@H_404_3@)@H_404_3@编译运行没错@H_404_3@,@H_404_3@然后编译生成生成代码@H_404_3@,@H_404_3@假设这代码有语法错误@H_404_3@,@H_404_3@你需要返回到生成器工程对应的字符地方修改这些字符@H_404_3@,@H_404_3@如果生成代码语法没有但运行有错@H_404_3@,@H_404_3@那还要分析你所设计的生成代码是否有问题@H_404_3@.@H_404_3@这种过程是不断的在生成代码和被生成代码之间切换@H_404_3@,@H_404_3@编译@H_404_3@,@H_404_3@生成@H_404_3@,@H_404_3@拷贝@H_404_3@,@H_404_3@编译@H_404_3@.....(@H_404_3@有时候会很乱@H_404_3@!)@H_404_3@


@H_404_3@

3.5通过@H_404_3@序列化/@H_404_3@反序列化代码生成器@H_404_3@,@H_404_3@体会到用代码代码跟@H_404_3@C++@H_404_3@的模板编程@H_404_3@(@H_404_3@泛化编程@H_404_3@)@H_404_3@有与曲同工之妙@H_404_3@!@H_404_3@必须在更高一层处想问题@H_404_3@.@H_404_3@当然泛化编程更规范@H_404_3@,@H_404_3@更标准@H_404_3@.(@H_404_3@看这文章@H_404_3@).@H_404_3@


@H_404_3@

3.6C++代码生成生成代码@H_404_3@,@H_404_3@生成代码要编译后才能用@H_404_3@,@H_404_3@这是因为@H_404_3@C++@H_404_3@的语言特性决定的@H_404_3@.@H_404_3@假设我有一个代码生成器@H_404_3@,@H_404_3@生成代码不需要编译@H_404_3@,@H_404_3@能直接使用@H_404_3@,@H_404_3@那多好啊@H_404_3@.@H_404_3@脚本语言可以@H_404_3@(@H_404_3@看这文章@H_404_3@).@H_404_3@

猜你在找的XML相关文章