2011-04-21 9 views
11

Necesito (de) serializar datos tanto en Windows como en Linux (y transferir los archivos intermedios). Quería usar los archivos binarios portátiles de la biblioteca de serialización de Boost que se pueden encontrar en los ejemplos, ver p. en http://boost-doc-zh.googlecode.com/svn-history/r380/trunk/libs/serialization/example/archivo portátil que no se compila bajo GCC

Esto funciona bien en Windows (VS 2008) pero no se compila bajo GCC 4.3.2 con los siguientes errores.

¿Alguien puede sugerir una solución?

¡Muchas gracias!

/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp: In member function 'void portable_binary_iarchive::init(unsigned int)': 
/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp:78: error: 'uint_least32_t boost::archive::version_type::t' is private 
/home/myfolder/src/portable_binary_iarchive.cpp:92: error: within this context 
/home/myfolder/src/portable_binary_iarchive.hpp: In member function 'void portable_binary_iarchive::load(T&) [with T = boost::archive::class_id_type]': 
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:107: instantiated from 'static void boost::archive::load_access::load_primitive(Archive&, T&) [with Archive = portable_binary_iarchive, T = boost::archive::class_id_type]' 
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:356: instantiated from 'static void boost::archive::detail::load_non_pointer_type<Archive>::load_primitive::invoke(Archive&, T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]' 
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:433: instantiated from 'static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]' 
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:586: instantiated from 'void boost::archive::load(Archive&, T&) [with Archive = portable_binary_iarchive, T = boost::archive::class_id_type]' 
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/common_iarchive.hpp:66: instantiated from 'void boost::archive::detail::common_iarchive<Archive>::load_override(T&, int) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]' 
/home/myfolder/src/portable_binary_iarchive.hpp:140: instantiated from 'void portable_binary_iarchive::load_override(T&, int) [with T = boost::archive::class_id_type]' 
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/interface_iarchive.hpp:60: instantiated from 'Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]' 
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/common_iarchive.hpp:51: instantiated from 'void boost::archive::detail::common_iarchive<Archive>::vload(boost::archive::class_id_type&) [with Archive = portable_binary_iarchive]' 
/home/myfolder/src/portable_binary_iarchive.cpp:128: instantiated from here 
/home/myfolder/src/portable_binary_iarchive.hpp:107: error: call of overloaded 'class_id_type(intmax_t&)' is ambiguous 
/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp:118: note: candidates are: boost::archive::class_id_type::class_id_type(size_t) 
/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp:115: note:     boost::archive::class_id_type::class_id_type(int) 

Respuesta

1

No es realmente una respuesta directa a su pregunta, pero he tenido mucho éxito con los Protocolos de Protocolo de Google. Los usan internamente y los abren de fuentes: http://code.google.com/p/protobuf/

+0

Gracias, pero sé protobuf, y no encaja bien en mi arquitectura. Así que estoy buscando una forma de serialización de Boost para hacerlo. – Philipp

0

He construido con g ++ 4.1.2 y funciona bien. Odio bjam, es difícil ver lo que está sucediendo, y es increíblemente lento. Hubo una advertencia sobre un encabezado en desuso, y como esto tiene las características de una declaración de amigo obsoleta, esperaba ver algo viejo, pero no es así.

¿Lo construyó con bjam o intentó sacar la serialización en su propio directorio y hacerlo usted mismo? Porque su estructura de directorios no es exactamente como la que tienen en el paquete.

0
#define private public 

debe deshacerse del primer error sobre el acceso a miembros privados. ¡Es un poco descarado! Pero puede funcionar como una solución temporal hasta que haya entendido mejor todo el programa.

+0

¿Tiene esto el potencial de romper otro código? – shuttle87

+0

Creo que es seguro hacerlo. Nunca lo he hecho yo mismo, excepto para probar que funciona. Otra forma de hacerlo es simplemente pasarlo en la línea de comando a la compilación 'g ++ -Dprivate = public prog.cpp -o prog'. Por supuesto, es su responsabilidad asegurarse de que trate los datos privados correctamente. Pero si comprende los aspectos internos de esa clase correctamente, debería poder interactuar con ella de manera sensata. –

Cuestiones relacionadas