使用过微软framework 的人对他的序列化肯定印象深刻,方便性真是没得说了。之前用C#做过一套绘图系统,图形的保存,以及保存后的版本兼容性基本上没费什么时间。后来发现,其实序列化在其他方面应用很多,比如通讯,我只要定义好链路帧格式,其他应用内容都可以交给序列化来做,非常的方便。现在的系统,基于c/c++ 跨平台。这么重要的基础功能也不想基于他看第3方控件。仔细研究了下framewok的序列化机制,决定自己实现。
首先,要定位功能,肯定没办法和framework比,毕竟基础和能力在那里,只实现基本功能,而且功能受一定的约束。
其次,准备工作:
a 所有类的基类需要定义 CJObject;
b 所有类需要能动态生成,以及信息可查询,这个就之际借鉴MFC的动态生成机制,现成的东东,改粑改粑就能用
c 为了编程方便,仿照framework 引入CJType类,所有基于CJObject的类都可以直接获取CJType对象,通过它就可以查询类型信息,CJObject 和 CJType的定义:(逐步更新)
class EXPORTED_JHMF CJObject
{
DECLARE_CLASS(CJObject)
public:
CJObject();
CJType GetType();
jbool IsKindOf(const CJRuntimeClass* pClass);
jint32 GetHashCode();
//序列化接口
virtual void GetObjectData(CJSerializationInfo* info) {}
virtual void DeSerializationObjectData(CJSerializationInfo* info) {}
private:
jint32 m_hashCode;
};
序列化接口纯属仿照framework做,感觉这种做法特别方便
class EXPORTED_JHMF CJType
{
//类名称
public:
CJType();
CJType(CJRuntimeClass* pRuntimeClass);
~CJType();
jbool IsEmpty(){return m_pRuntimeClass == JNULL;}
jbool IsArray();
jbool IsSubclassOf(CJType t);
CJString GetName();
CJRuntimeClass* GetRuntimeClass() const {return m_pRuntimeClass;}
private:
CJRuntimeClass* m_pRuntimeClass;
};
inline jbool operator==(const CJType& t1, const CJType& t2)
{ return t1.GetRuntimeClass() == t2.GetRuntimeClass(); }
有了这些,基本上可以开始序列化工作了