【问题标题】:Qt Should I derive from QDataStream?Qt 我应该从 QDataStream 派生吗?
【发布时间】:2011-01-26 13:42:35
【问题描述】:

我目前正在使用QDataStream 来序列化我的课程。我有很多我自己经常序列化的类。我应该派生 QDataStream 来创建自己的 DataStream 类吗?还是有比这更好的模式?请注意,我们的许多项目都使用这些自定义类,所以这样做可能会使编码更容易。

另一种表述这个问题的方式是:当框架为您提供序列化类时,您如何处理您自己的自定义类型类的序列化,这样您就不必每次都记住如何序列化它们(增强可用性)并遵循最佳软件工程实践(遵循模式)。

【问题讨论】:

    标签: c++ qt code-reuse


    【解决方案1】:

    这很快就会失控。更好的方法是在QDataStream 和您的班级之间定义operator<<operator>>。更简洁的方法可能是在您的类上简单地使用序列化方法来读取/写入QDataStream(例如,您可以调用obj->serialize(myStream))。

    【讨论】:

      【解决方案2】:

      我目前的处理方式如下:

      我不是从 QDataStream 派生,而是为每个需要序列化的对象创建一个序列化器类。

      例如,如果我有:

      class MyOwnClass
      

      然后我会创建一个名为:

      class MyOwnClassSerializer
      {
      public:
        static QByteArray const serialize(MyOwnClass const&);
      };
      

      我没有加的原因

      QByteArray serialize() const;
      

      class MyOwnClass 是为了让人们可以在不依赖Qt 的情况下使用MyOwnClass。也不是所有的MyOwnClass 客户都对序列化类感兴趣。

      任何 cmets 将不胜感激! =)

      【讨论】:

      • <<>> 运算符将充当序列化程序类。它们不必在数据类上定义,而是一个独立的函数。
      • 我应该把>><< 操作符放在哪里最好?在一对 .h 和 .cpp 中,对于每种新的数据类型,我只是添加到那组文件中?
      • 如果您不希望类依赖于 Qt,那么单独的文件是唯一的方法。否则我会将它们定义在与数据类相同的文件中。
      • @Lukas,如果 MyOwnClass 继承自其他类怎么办?
      • @Lukas,我现在能想到的最好方法是:*reinterpret_cast(&myOwnClass);例如将其重新解释为 BaseClass ...但这看起来有点难看。有没有更好的办法?