反序列化笔记

http://topic.csdn.net/t/20020311/10/567589.html

C++对象的序列化(Serialize)的一般化解决方法:。 

在jjhou的《深入浅出MFC》一书中,曾有部分章节提到了这个主题,MFC中也有类似的实例。只不过,我所需要的是更具有一般化意义的通用的解决方案。 

首要的一点,在一个包含类层次的设计中,我可以使用类的标示将对象的类型信息格式化输出到stream中,在从stream中读取时,解析这个类型信息来决定实例化哪一个类。 
显而易见的问题是,类自己可以正确的识别stream中的内容是否与自己的类型相匹配,可是作为类的使用者来说,他并没有简单的方法获知应该使用这个stream来实例化哪一个类。 最简单的方法,就是使用从stream中提取类型信息,进行判断,然后显式的调用相应类的构造函数进行实例化。但是,这样造成的问题,就是在客户代码中进行了硬编码,导致设计缺乏灵活性。 
可以使用《Design   Pattern》中提到的创建型模式来解决缺乏弹性的问题。我的考虑是可以采用prototype模式,在类库中使用singleton模式实例化所有支持序列化的类,并提供一个在类型标示信息(典型的是字符串)和实际类型的对象指针之间的单一映射(map)。 
这样,客户代码仅需要使用映射关系去匹配stream中的类型信息,即可以正确的实例化类,但是必须满足的库的设计要求是所有的类必须从一个共同的基类祖先派生(可以是多次)而来,同时序列化功能必须是虚函数,才可以籍由一个单一的指针来实例化所有可能的类型。 
最后的结果,类库的层次的更改,不影响用户代码的正确性。 最后的问题是,如果我要对一个已知的类体系提供序列化支持,怎样才可以有更通用的解决方案呢?

两个map: 
一个map把类型的typeID和指向生成生成此类对象的函数的指针(static)相关联,解决不能由字符串生成类对象的问题. 
一个map把ObjectID和指向该Object的指针相关联,解决程序再次运行时对象的内存地址变化的问题.

 

 

 

posted @ 2012-09-17 22:13  hailong  阅读(185)  评论(0编辑  收藏  举报