我的数据结构的最佳序列化方法
Best serialization method for my data structure?
这里问的第一个问题。我尝试过使用 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;
}
}
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 对于不同的语言,是否有任何稳定的序列化方法?
- 在对象序列化期间添加额外参数是否有更好的方法?
- 使用原始字节向量作为提升序列化的存档的任何方法
- 序列化没有"save"方法的大型结构
- 我的数据结构的最佳序列化方法
- 是否有一种方法可以使用Boost Serialization序列化迭代器
- 类序列化方法
- "resurrect"(序列化/和反序列化)标准的最快方法::map
- 用C++序列化二进制数据的正确方法
- 在Objective-C中,使用C#Protobuf-Net生成的“序列化Protobuf”的最佳方法是什么?
- 在C++中快速制作一些序列化原型的肮脏方法?
- 如何将序列化方法添加到作为Windows数据结构的类成员中,以便在C++中与boost序列化一起使用
- 在没有序列化库的情况下,在 c++ 中从结构体读取和写入文件的最简单方法是什么?
- 在Qt中序列化对象图有哪些方法
- 在 Boost::Serialise 中序列化类的非侵入式方法是否使类可序列化
- C/C++:序列化方法应该是类成员吗
- c++中序列化消息的方法
- Boost::serialization——是否有一种可移植的方法来对std::wstring进行二进制序列化?
- 我们是否可以在不同的类中分离主序列化方法,以便使用c++的boost库使其更容易和不那么复杂?