【问题标题】:Serialization of an unknown object未知对象的序列化
【发布时间】:2016-12-16 18:28:44
【问题描述】:

我一直在寻找能够序列化完全未知对象的东西。

我知道 Qt 有一个 serialization 功能,它也适用于 qvariant 对象。这是否意味着我可以将任何复杂的对象传递给 QVariant(即也具有指针和/或指针循环的对象)并序列化该对象?

好像也是boost::any isn't supported by serialization

由于在 C++ 中缺乏反射,如果不编写我自己的特定类型序列化例程,这是否不可能?

【问题讨论】:

  • “未知对象”是什么意思?你能用一个你想要实现的例子来编辑你的问题吗?
  • @wasthishelpful unknown object 表示 unknown object.. 它可以是任何类型的 C++ 对象,您可以在您选择的任何项目的 github 上找到。
  • 这不是未知的,那是未定义的,也许是未声明的 :) 这就是为什么我要一个示例来说明您希望最终代码如何工作,以从编译器的角度弄清楚未知的含义
  • @wasthishelpful 在你的程序中编译的东西,你可以传递给template<typename T> void serialize(T&& obj); 函数。
  • A QVariant 不能保存任意类型。来自the documentation:“QVariant 类的作用类似于最常见的 Qt 数据类型的联合。”

标签: c++ qt serialization boost


【解决方案1】:

您可以序列化任何QVariant,只要您希望QVariant 携带的所有类型都定义了它们的QDataStream 运算符。因此,对于您自己的自定义类型,您需要将这些运算符放在适当的位置,然后它才能正常工作。

【讨论】:

    【解决方案2】:

    是的,不编写自己的序列化代码是不可能做到这一点的,因为 C++ 没有反射。你,差不多,想通了。

    【讨论】:

    【解决方案3】:

    虽然 C++ 没有反射,但如果您使用 QObjects 和 Qt Property System,则可以在 Qt 中获得有限的反射。

    编写代码来序列化和反序列化任何 QObject 的所有属性是相当容易的。 [提示:有一些方法可以检索 QObject 的所有属性。] 这里的权衡是,您希望序列化的所有内容都必须是 QObject(并且 QObjects 不能具有复制构造函数),并且您的 getter 和 setter 必须使用属性.使用一些聪明的宏,从编码的角度来看,这不是一个太大的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      相关资源
      最近更新 更多