【发布时间】:2011-03-17 04:14:53
【问题描述】:
如何从序列化数据中“反序列化”派生类?或者我应该说,有没有更好的方法将数据“反序列化”到派生类中?
例如,假设您有一个纯虚拟基类 (B),它被其他三个类 X、Y 和 Z 继承。此外,我们有一个方法 serialize(),它将转换 X:B、Y :B 和 Z:B 转化为序列化数据。
通过这种方式,它可以通过套接字、命名管道等传输到远程进程。
我的问题是,我们如何从序列化的数据中创建一个合适的对象?
我能想到的唯一解决方案是在序列化数据中包含一个标识符,该标识符指示最终派生对象类型。接收者首先从序列化数据中解析派生类型字段,然后使用 switch 语句(或某种类似的逻辑)来调用适当的构造函数。
例如:
B deserialize( serial_data )
{
parse the derived type from the serial_data
switch (derived type)
case X
return X(serial_data)
case Y
return Y(serial_data)
case Z
return Z(serial_data)
}
所以在了解了派生对象类型之后,我们调用了适当的派生类型构造函数。
但是,这感觉很尴尬和麻烦。我希望有一种更雄辩的方式来做到这一点。有吗?
【问题讨论】:
-
紧凑序列化(按位)可能会咬紧牙关,特别是如果您打算将内容保存到文件中。随着岁月的流逝和课程的变化,当您再次尝试加载它们时,您几乎被搞砸了。出于这个原因,使文件自我记录和版本控制是一个好主意。只有当客户端和服务器始终就所使用的协议达成一致时,才可以发送直接字节。如果没有,那么我会求助于
XML/JSON。但是,我也会研究可以使这更容易的东西,例如SOAP等。 -
@Hamish +1,请回答!
标签: c++ serialization