2016-04-25 2 views
0

Ich versuche zu lernen, Serialisierung/Deserialisierung im Moment zu verwenden, Getreide zu verwenden. Um Dinge auszuprobieren, habe ich die Objekte einer 3D-Szene in eine .xml-Datei serialisiert (es ist leichter zu verstehen, wann Sie die Ausgabe tatsächlich lesen können). Die Serialisierung funktioniert ohne Probleme, und die Deserialisierung scheint dies auch zu tun. Wenn ich nun die Objekte neu erstellen möchte, habe ich kein Problem damit, auf die erste zuzugreifen ... aber wie bekomme ich den Rest?Suchen Sie nach einem Beispiel für den Zugriff auf Daten in deserialisierten Cerealien .xml-Dateien (Cereal, C++ 11)

Serialisierung in der CPP (abgekürzt):

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; 
} 

Es funktioniert, und schafft testdata.xml, so etwas wie folgt aussehen:

<?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> 
... 

usw.

Wenn ich jetzt Verwenden Sie

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); 

zu deserialisieren, kompiliert, läuft und ich kann auf den ersten Datensatz (ID, Vertices, Dreiecke, bis zum ersten </cereal>) zugreifen. Aber ich habe keine Ahnung, wie ich auf den Rest zugreifen kann.

Es ist durchaus möglich, dass ich etwas offensichtlich offensichtliches verpasse und etwas übersehe, während ich direkt darauf starre. Aber ich bin mir auch nicht sicher, ob das Serialisieren der Daten auf diese Weise sogar ein vernünftiger Ansatz ist.

Antwort

0

Ihr Problem besteht darin, dass Sie jedes Mal ein neues Archiv erstellen, wenn die for-Schleife wiederholt wird.

Dies sollte Ihr Problem beheben:

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

Sorry für die späte Beantwortung. Das ändert nicht viel, tatsächlich fügt es einige seltsame Zeilen von ' ' zwischen den Datensätzen hinzu. – UnHeinz

Verwandte Themen