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 に答える