2016-04-25 1 views
0

J'essaie d'apprendre à utiliser la sérialisation/désérialisation pour le moment en utilisant des céréales. Pour tester les choses, j'ai sérialisé les objets d'une scène 3D dans un fichier .xml (c'est plus facile à comprendre quand vous pouvez réellement lire la sortie, après tout). La sérialisation fonctionne sans problèmes, et la désérialisation semble également le faire. Quand je veux maintenant recréer les objets, je n'ai aucun problème pour accéder au premier ... mais comment puis-je obtenir le reste?Recherche d'un exemple d'accès aux données dans des fichiers .erml de céréales désérialisées (Cereal, C++ 11)

sérialisation dans le cpp (en abrégé):

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

Il fonctionne, et crée testdata.xml, en regardant quelque chose comme ceci:

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

etc.

Quand je maintenant utiliser

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

pour désérialiser, il compile, s'exécute et je peux accéder au premier ensemble de données (ID, sommets, triangles, jusqu'à la première </cereal>. Mais je n'ai pas la moindre idée de comment je peux accéder au reste.

Il est tout à fait possible que je manque quelque chose de façon flagrante et que je néglige quelque chose en y regardant de plus près. Mais je ne suis pas sûr non plus si la sérialisation des données de cette façon est même une bonne approche.

Répondre

0

Votre problème est que vous créez une nouvelle archive chaque fois que la boucle for se répète.

Cela devrait résoudre votre problème:

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

Désolé pour répondre à cette fin. Cela ne change pas grand chose, en fait il ajoute des lignes plus étranges de ' ' entre les jeux de données. – UnHeinz