有没有办法以通用和可移植的方式识别序列化类型?我知道std::type_index
和std::type_info
是平台相关的,不能用于序列化。
一种方法是在std::type_index
和一个“类型信息”之间制作地图并序列化“类型信息”,但这会减慢序列化。
有没有标准的方法呢?
PS:我想学习如何进行有效的序列化,我不想使用库。
答案 0 :(得分:1)
有没有办法以通用和可移植的方式识别序列化类型?
可以通用但不可移植的方式。
从std::type_info::name()
返回的字符串通常是一个唯一标识类型的错位类型名称。此名称可用于标识序列化对象的类型。
名称修改因编译器而异,因此使用其他编译器编译的程序可能无法读取序列化对象。
答案 1 :(得分:1)
如果您想将对象从一个进程传递到另一个进程,并且这些进程碰巧在不同的时间和不同的计算机上运行,那么您所看到的更多是消息传递而不是序列强>
有高效的消息传递库:Google的Protobuf或Apache的Thrift就是很好的例子。
关键思想是将消息的定义外部化,使其与平台(和编译器)无关,然后从该定义生成代码绑定。然后从您的代码中,您将在内存中创建消息,序列化该消息(xml / json / binary),然后在另一个平台上将消息反序列化为另一个内存中表示。
如果感觉像是一个补充步骤,那就好了。另一方面,这意味着消息格式不再与内部实现(间接层......)相关联,因此您可以随意更改内部实现,同时仍然能够读取/写入消息在各种版本中(例如,与程序的旧部署版本的交互)。