这里曾问过第一个问题。我尝试过使用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 );
}
答案 0 :(得分:2)
我强烈推荐Cereal C ++序列化库。它优于boost.serialization的优点包括:仅标题,更新/更好的模板编程结构,json存档和可移植的二进制存档。它的唯一缺点(在我看来)是:它需要C ++ 11(对于Visual Studio 2015或更新版本),并且它仅支持智能指针的序列化(即,不能序列化原始指针 - 但这简化了对象跟踪并保持从档案中走出来,这有助于一个漂亮,干净,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
}
};
谷歌也有Standard Library Support。如果您有std::vector
个guestBook
个对象,则只需要#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;
}
}