【问题标题】:Identify type in a generic portable way in C++在 C++ 中以通用可移植方式识别类型
【发布时间】:2013-01-25 03:04:20
【问题描述】:

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

一种方法是在std::type_index 和一个“类型信息”之间建立一个映射并序列化“类型信息”,但这会减慢序列化速度。

有什么标准的方法吗?

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

【问题讨论】:

  • 恐怕如果你不打算使用图书馆,那么你会发现自己在写一个。 C++ 在没有反射的情况下让它变得很困难。
  • 即使你不想使用一个库,你也可以从查看一个库的编写方式开始,例如Boost.Serialization.
  • 这取决于你所说的“便携”。如果您要使用写入数据的相同二进制文件来读取数据,则可以直接使用type_index。如果性能那么很关键,您始终可以这样做并使用单独的函数(可能在单独的进程中运行)来收集原始数据并以更明智的方式对其进行序列化。
  • @KerrekSB 我想使用相同的库,但在不同的平台上。我想在 PC 上编写文件并在不同的移动平台上读取它们。我认为类型特征是最好的解决方案——从真实类型中获取“可序列化类型”并从“可序列化类型”中获取真实类型
  • 非平凡类型无论如何都必须支持序列化。因此,只需为每个此类类型注册一个唯一 ID,例如 UUID。

标签: c++ serialization c++11


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    如果你想将你的对象从一个进程传递到另一个进程,而这些进程恰好在不同的时间和不同的机器上存在,那么你所看到的更多的是 messengering 而不是 序列化。

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多