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

Best serialization method for my data structure?

本文关键字:序列化 方法 最佳 数据结构 我的      更新时间:2023-10-16

这里问的第一个问题。我尝试过使用 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 );
}

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

下面是快速启动页中的示例

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
  }
};

谷物还具有标准库支持。如果您有guestBook对象的std::vector,那么只需要#include <cereal/types/vector.hpp>(除了 guestBook::serialize 方法之外(即可将向量写入存档。

在Qt中(正如你在标签中提到的(,我更愿意使用QDataStream序列化类成员,而不是添加新的库(这实际上增加了新的错误!!(,也受益于Qt的漂亮功能,如隐式共享。

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

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;
    }
}