用C ++中的通用可移植方式识别类型

时间:2013-02-09 12:06:31

标签: c++ serialization c++11

有没有办法以通用和可移植的方式识别序列化类型?我知道std::type_indexstd::type_info是平台相关的,不能用于序列化。

一种方法是在std::type_index和一个“类型信息”之间制作地图并序列化“类型信息”,但这会减慢序列化。

有没有标准的方法呢?

PS:我想学习如何进行有效的序列化,我不想使用库。

2 个答案:

答案 0 :(得分:1)

  

有没有办法以通用和可移植的方式识别序列化类型?

可以通用但不可移植的方式。

std::type_info::name()返回的字符串通常是一个唯一标识类型的错位类型名称。此名称可用于标识序列化对象的类型。

名称修改因编译器而异,因此使用其他编译器编译的程序可能无法读取序列化对象。

答案 1 :(得分:1)

如果您想将对象从一个进程传递到另一个进程,并且这些进程碰巧在不同的时间和不同的计算机上运行,​​那么您所看到的更多是消息传递而不是序列

有高效的消息传递库:Google的Protobuf或Apache的Thrift就是很好的例子。

关键思想是将消息的定义外部化,使其与平台(和编译器)无关,然后从该定义生成代码绑定。然后从您的代码中,您将在内存中创建消息,序列化该消息(xml / json / binary),然后在另一个平台上将消息反序列化为另一个内存中表示。

如果感觉像是一个补充步骤,那就好了。另一方面,这意味着消息格式不再与内部实现(间接层......)相关联,因此您可以随意更改内部实现,同时仍然能够读取/写入消息在各种版本中(例如,与程序的旧部署版本的交互)。