Ищем пример того, как получить доступ к данным в десериализованных .xml файлах зерновых (Cereal, C ++ 11)

Я пытаюсь научиться использовать сериализацию / десериализацию в данный момент, используя зерновые. Чтобы проверить это, я сериализовал объекты 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>, Но я не имею ни малейшего понятия, как мне получить доступ к остальному.

Вполне возможно, что я упускаю что-то явно очевидное и упускаю из виду что-то, глядя прямо на это.
Но я также не уверен, что сериализация данных таким способом является даже разумным подходом.

0

Решение

Ваша проблема в том, что вы создаете новый архив каждый раз, когда повторяется цикл 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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]