0

我正在尝试学习如何使用谷物来使用序列化/反序列化。为了进行测试,我将 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);

反序列化,它编译,运行,我可以访问第一组数据(ID,顶点,三角形,直到第一个</cereal>。但我不知道如何访问其余部分。

我很可能错过了一些明显的东西,而我在盯着它看的时候忽略了一些东西。但我也不确定以这种方式序列化数据是否是一种合理的方法。

4

1 回答 1

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;
}
于 2016-04-27T18:53:35.140 回答