我的数据结构的最佳序列化方法?

时间:2017-05-16 18:02:46

标签: c++ visual-studio qt serialization boost

这里曾问过第一个问题。我尝试过使用Boost,但我们无法弄清楚它在我的结构中是如何工作的。此外,.lib缺失错误即使在将其添加到其他库之后也会继续发生等。就像它运行了几次运行一样,然后再出现没有弹出的地方。第一次通过制作一个新项目来修复它,但我没有时间继续这样做。

无论如何,我已经将我的代码从Visual Studio移到了QT Creator。现在我正在阅读有关XML或JSon的一些内容并思考是否应该尝试实现它?

事情是,我整整一天都想知道明天到期的最终项目的序列化问题。一旦我得到了这个,我需要制作一个我希望会更容易的GUI。提前致谢。以下是我使用Boost

的最佳尝试
Hotel.h

class guestBook {
    protected:
    friend class roomBook;
    friend class hashMap;
    struct guest {
        int guestKey;
        string firstName;
        string lastName;
        guest *next;
        template<class Archive>
        void serialize( Archive & ar )
        {
            ar( guestKey, firstName, lastName);
        }
    };
    guest* guestHashTable[tableSize];
    public:
    void writeGuestTable();
    void readGuestTable();
    void addGuest(string firstName, string lastName);
    int numberOfItemsInBucket(int index);
    void retrieveGuestID();
};
guestBook.cpp
void hashMap::writeGuestTable() {
    for(int x=0;x<tableSize;x++){
       guestHashTable[x] = new guest;
       guestHashTable[x]->guestKey = 0;
       guestHashTable[x]->firstName = "empty";
       guestHashTable[x]->lastName = "empty";
    }
    ofstream os("guestTable.txt", ios::binary);
    cereal::BinaryOutputArchive archive( os );
    guest myData;
    archive( myData );
}

2 个答案:

答案 0 :(得分:2)

我强烈推荐Cereal C ++序列化库。它优于boost.serialization的优点包括:仅标题,更新/更好的模板编程结构,json存档和可移植的二进制存档。它的唯一缺点(在我看来)是:它需要C ++ 11(对于Visual Studio 2015或更新版本),并且它仅支持智能指针的序列化(即,不能序列化原始指针 - 但这简化了对象跟踪并保持从档案中走出来,这有助于一个漂亮,干净,json档案)。

以下是Quick Start Page

中的示例
struct MyClass
{
  int x, y, z;

  // This method lets cereal know which data members to serialize
  template<class Archive>
  void serialize(Archive & archive)
  {
    archive( x, y, z ); // serialize things by passing them to the archive
  }
};

谷歌也有Standard Library Support。如果您有std::vectorguestBook个对象,则只需要#include <cereal/types/vector.hpp>(除了guestBook::serialize方法之外)就可以将矢量写入存档

答案 1 :(得分:0)

在Qt中(正如你在标签中提到的),我更喜欢使用QDataStream序列化类成员,而不是添加新库(实际上添加新的错误!!),也可以从Qt的优秀功能中获益,如隐式共享。

QDataStream生成二进制序列化数据并了解泛型类型和Qt类,如QByteArray和QString ......并且还保证所有平台中的数据类型具有相同的宽度和大小,因此可以用作跨平台解决方案。 / p>

class  TestClass{
    QString strA;
    QByteArray ba;
    int a;
    quint32 b;

    QByteArray serialize(){
        QByteArray serializedData;
        QDataStream ds(&serializedData, QIODevice::WriteOnly);

        ds << strA;
        ds << ba;
        ds << a;
        ds << b;

        return serializedData;
    }

    static TestClass deserialize(QByteArray serializedData){
        TestClass deserializedClass;

        QDataStream ds(&serializedData, QIODevice::WriteOnly);

        ds >> deserializedClass.strA;
        ds >> deserializedClass.ba;
        ds >> deserializedClass.a;
        ds >> deserializedClass.b;

        return deserializedClass;

    }
}