Нет смысла иметь вектор person
, так как будет очень сложно сериализовать и сохранить как JSON.
Вместо этого вы можете поддерживать сериализованные строки объектов в vector
и сохранять ихв виде json
массива в Document
.
. Вы можете сохранить документ person json в локальном хранилище с помощью FileWriteStream
:
#include "include/rapidjson/writer.h"
#include "include/rapidjson/stringbuffer.h"
#include "include/rapidjson/document.h"
#include "include/rapidjson/ostreamwrapper.h"
#include "include/rapidjson/filewritestream.h"
#include "include/rapidjson/filereadstream.h"
#include "fstream"
#include "iostream"
#include "sstream"
vector<string> Save; // replace vector<person> with vector<string>
//
person P1("Tak", "Nie", 20);
person P2("Yes", "No", 10);
// more persons
//
Save.push_back(P1.serialize());
Save.push_back(P2.serialize());
// push more persons
//
Document d; // rapidjson Document
d.SetArray(); // to store Array of objects
rapidjson::Document::AllocatorType& allocator = d.GetAllocator();
// iterate over objects vector created above
// and create rapidjson Values for each object
// Then store the object in Document
for (auto it = Save.begin(); it!=Save.end(); it++){
Value n((*it).c_str(), allocator);
d.PushBack(n,allocator);
}
// save rapidjson Document to local storage file name "output.json"
FILE* fp = fopen("output.json", "wb");
char writeBuffer[65536];
FileWriteStream os(fp, writeBuffer, sizeof(writeBuffer));
Writer<FileWriteStream> writer(os);
d.Accept(writer);
fclose(fp);
Теперь всеВаши объекты были сериализованы, хранятся как элементы в массиве в документе.
Теперь, чтобы восстановить объекты в массив классов person
, скажем, P[]
, мы можем сделать обратное, сначала используя FileReadStream
, чтобы восстановить сохраненный массив rapidjson
в Document
, затем итерируйте по вашему документу объекты выборки один за другим, используйте данные для создания новых person
классов:
// restore saved rapidjson Document from file "output.json"
FILE* fp = fopen("output.json", "rb"); // non-Windows use "r"
char readBuffer[65536];
FileReadStream is(fp, readBuffer, sizeof(readBuffer));
Document d;
d.ParseStream(is);
fclose(fp);
//
assert(d.IsArray());
int size= d.Size();
person* P[size+1]; // Now create an array of class person to restore retrieved objects.
// person object paramets
std::string theName;
std::string theSur;
int theid;
// loop over the Array Document
for (int i = 0; i < d.Size(); i++)
{
Document P1_doc; // new rapidjson Document
P1_doc.Parse(d[i].GetString()); // parse each object from d into new Dcoument P1_doc
assert(P1_doc.IsObject());
// now restore each person object data
if(P1_doc.HasMember("name")){
const rapidjson::Value& name = P1_doc["name"];
theName = name.GetString();
}
if (P1_doc.HasMember("surname")){
const rapidjson::Value& surname = P1_doc["surname"];
theSur = surname.GetString();
}
if (P1_doc.HasMember("id")){
const rapidjson::Value& id = P1_doc["id"];
theid = id.GetInt();
}
// Now restore a person object from retrieved data
P[i] = new person(theName, theSur, theid);
}
return 0;