Я пытаюсь научиться использовать сериализацию / десериализацию в данный момент, используя зерновые. Чтобы проверить это, я сериализовал объекты 3D-сцены в XML-файл (в конце концов, легче понять, когда вы действительно можете прочитать вывод).
Сериализация работает без проблем, и десериализация также, кажется, делает это. Теперь, когда я хочу воссоздать объекты, у меня нет проблем с доступом к первому объекту … но как мне получить остальные?
Сериализация в .cpp (сокращенно):
std::ofstream os("testdata.xml");for (int i=0; i<alloftheobjects; i++)
{
3DObject *Object = new 3DObject;
Object->ID = ID;
Object->vertices = vectorOfPoints;
Object->triangles = vectorOfTriangles;
cereal::XMLOutputArchive archive(os);
archive(cereal::make_nvp("ID", Object->ID),
cereal::make_nvp("Points", Object->vertices),
cereal::make_nvp("Triangles", Object->triangles));
delete Object;
}
Он работает и создает testdata.xml, выглядя примерно так:
<?xml version="1.0" encoding="utf-8"?>
<cereal>
<ID>0111</ID>
<Points size="dynamic">
<value0 size="dynamic">
<value0>-5</value0>
<value1>-5</value1>
<value2>1</value2>
</value0>
....rest of the points
</Points >
<Triangles size="dynamic">
...triangle data
</Triangles>
</cereal>
<?xml version="1.0" encoding="utf-8"?>
<cereal>
<ID>0112</ID>
<Points size="dynamic">
...pointdata
</Points >
<Triangles size="dynamic">
...triangle data
</Triangles>
</cereal>
...
и т.п.
Когда я сейчас использую
std::ifstream is("testsdata.xml");
cereal::XMLInputArchive archive(is);
int ID;
std::vector<std::vector<double>> vertices;
std::vector<std::vector<int>> triangles;archive(ID, vertices, triangles);
для десериализации, он компилируется, запускается, и я могу получить доступ к первому набору данных (идентификатор, вершины, треугольники, до первого </cereal>
, Но я не имею ни малейшего понятия, как мне получить доступ к остальному.
Вполне возможно, что я упускаю что-то явно очевидное и упускаю из виду что-то, глядя прямо на это.
Но я также не уверен, что сериализация данных таким способом является даже разумным подходом.
Ваша проблема в том, что вы создаете новый архив каждый раз, когда повторяется цикл for.
Это должно исправить вашу проблему:
std::ofstream os("testdata.xml");
cereal::XMLOutputArchive archive(os);
for (int i=0; i<alloftheobjects; i++)
{
3DObject *Object = new 3DObject;
Object->ID = ID;
Object->vertices = vectorOfPoints;
Object->triangles = vectorOfTriangles;
archive(cereal::make_nvp("ID", Object->ID),
cereal::make_nvp("Points", Object->vertices),
cereal::make_nvp("Triangles", Object->triangles));
delete Object;
}
Других решений пока нет …