2011-11-14 12 views
12

Tengo un mapa C++ STL, que es un mapa de int y customType. El customType es una estructura, que tiene una cadena y una lista de cadenas, ¿Cómo puedo serializar esto en un archivo?C++ Serializar un archivo std :: a un archivo

muestra struct:

struct customType{ 
string; 
string; 
int; 
list<string>; 
} 
+2

Mira en [Boost.Archive] (http://www.boost.org/doc/libs/release/libs/serialization/doc/tutorial.html). –

+2

Esto ya fue respondido muchas veces. Por ejemplo aquí: http://stackoverflow.com/questions/4422399/serialization-of-stl-class – astevanovic

Respuesta

6

Una solución simple es a la salida de cada miembro en una línea por sí mismo, incluyendo todas las cuerdas en la lista. Cada registro comienza con la clave del mapa y finaliza con un carácter especial o una secuencia de caracteres que no puede estar en la lista. De esta manera puede leer una línea a la vez, y saber que la primera línea es la clave del mapa, la segunda línea la primera cadena en la estructura, etc., y cuando llega a su secuencia especial de finalización de registros, sabe que la lista está lista y es hora del próximo artículo en el mapa. Este esquema hace que los archivos generados sean legibles y editables si necesita editarlos fuera del programa.

1

Si está pidiendo esto, entonces probablemente ya saben que no se puede serializar esto por medio de:

file.write((const char *) &mapOfCustom, sizeof(mapOfCustom)); 

El problema tiene que ver con objetos complejos (y en C++, incluso una variable de cadena es una objeto complejo), es decir, aquellos objetos que no son autónomos. En realidad, incluso la serialización simple tiene problemas, que van desde la compatibilidad de la plataforma hasta la compatibilidad uniforme del compilador (diferentes paddings, etc.).

Una forma de hacerlo es utilizar una biblioteca XML simple, como TinyXML:

http://www.grinninglizard.com/tinyxml/

y escribir guardar en XML, y restaurar los procedimientos de XML.

+0

No ha leído/entendido completamente mi respuesta. Por favor, hazlo de nuevo con más cuidado. – Baltasarq

1

C++ no tiene capacidades de reflexión como Java y otros, por lo que no hay una forma "automática" de hacerlo. Tendrá que hacer todo el trabajo usted mismo: abra el archivo, imprima cada elemento en un bucle y cierre el archivo. Además, no hay un formato estándar para el archivo, deberá definir uno que satisfaga sus necesidades. Por supuesto, hay bibliotecas para ayudar en esto, pero no son parte del lenguaje. Echar un vistazo a esta pregunta:

Is it possible to automatically serialize a C++ object?

también echar un vistazo a: http://s11n.net/

8

Si usted no tiene miedo de BOOST, tratar Serialize BOOST: (código de la plantilla, aquí puede haber algunos errores ...)

#include <boost/archive/binary_oarchive.hpp> 
#include <boost/archive/binary_iarchive.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/serialization/string.hpp> 
#include <boost/serialization/list.hpp> 

struct customType{ 
string string1; 
string string2; 
int i; 
list<string> list; 

// boost serialize 
private: 
    friend class boost::serialization::access; 
    template <typename Archive> void serialize(Archive &ar, const unsigned int version) { 
     ar & string1; 
     ar & string2; 
     ar & i; 
     ar & list; 
    } 
}; 

template <typename ClassTo> 
int Save(const string fname, const ClassTo &c) 
{ 
    ofstream f(fname.c_str(), ios::binary); 
    if (f.fail()) return -1; 
    boost::archive::binary_oarchive oa(f); 
    oa << c; 
    return 0; 
} 

Uso:

Save< map<int, customType> >("test.map", yourMap); 
0

Puede probar esto: cxx-prettyprint

+0

Me gusta el enlace, pero desafortunadamente eso no hace lo que el OP quiere. Para empezar, su 'customType' no implementa un operador de salida formateado (' >> ') y, lo que es más importante, la serialización generalmente no está * formateada * como salida, sino como un tipo de salida binaria en bruto. –

+0

Sí entendí su requisito, pero la serialización de impulso o el protobuf de Google podrían ser una exageración. De ahí mi sugerencia. – yasouser

Cuestiones relacionadas