
Robert Ramey wrote:
Larry Smith wrote:
I can not get these struct members to
serialize; I get compile errors, e.g. this fails to compile:
ar & fld; // where fld is: char[200]
Hmmm - works for me. The following example compiles just fine.
#include <sstream>
#include <boost/archive/text_oarchive.hpp>
struct x {
char y[200];
template<class Archive>
void serialize(Archive & ar, const unsigned int version){
ar & y;
}
};
int main(int argc, char *argv[]){
std::stringstream os;
boost::archive::text_oarchive oa(os);
const x x1;
oa & x1;
}
Robert Ramey
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
The structs we have to deal with are 'C' structs, not C++. They are included in approx 9000 source files; 90% of those source files are 'C', only 10% are C++. All of the source is compiled with 'pack 1' ('/Zp1 on Windows, __attribute__ ((packed)) on Linux gcc/g++) to eliminate 'pad fields' within the structs; all of the source files depend on this packed layout, so it can not be changed - things would break. Once we move to non-Intel servers, 'packed' will no longer be used on the server side; this is another reason to serialize-xfer-deserialize the data - the struct layouts/sizes will be very different between the workstation and server. Here's a highly reduced example: ----------------------- /* cmdef.h */ /* NOTE: on Linux/Intel with gcc/g++ 'ADPACKED' is * defined as '__attribute__ ((packed))'. * on Windows the '/Zp1' compile option is * used to pack the structs and 'ADPACKED' * is defined as empty. */ #ifdef __cplusplus extern "C" { #endif typedef struct ADPACKED NODE_MGR { char ApplName[8]; char CompName[8]; } NODE_MGR; #ifdef __cplusplus } #endif --------------------- /* arch.hpp */ #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> #include "cmdef.h" namespace boost { namespace serialization { template<class Archive> void serialize(Archive & ar, struct NODE_MGR & st, const unsigned int version) { ar & st.ApplName; // line 19 in err msg ar & st.CompName; // line 20 in err msg } } // end namespace serialization */ } // end of namespace boost */ -------------------- /* arch.cpp */ #include <sstream> #include "arch.hpp" int main() { struct NODE_MGR nm; std::ostringstream ofs; boost::archive::text_oarchive oa(ofs); oa << nm; // line 15 in err msg return 0; } ------------------- Compiling arch.cpp produces these errors: arch.hpp:19: error: cannot bind packed field ‘st->NODE_MGR::ApplName’ to ‘char (&)[8] arch.hpp:20: error: cannot bind packed field ‘st->NODE_MGR::CompName’ to ‘char (&)[8] Removing the 'packed' attribute produces a different set of errors: /usr/include/boost/archive/detail/oserializer.hpp: In function ‘void boost::archive::save(Archive&, T&) [with Archive = boost::archive::text_oarchive, T = NODE_MGR]’: /usr/include/boost/archive/basic_text_oarchive.hpp:78: instantiated from ‘void boost::archive::basic_text_oarchive<Archive>::save_override(T&, int) [with T = NODE_MGR, Archive = boost::archive::text_oarchive]’ /usr/include/boost/archive/detail/interface_oarchive.hpp:85: instantiated from ‘Archive& boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T = NODE_MGR, Archive = boost::archive::text_oarchive]’ arch.cpp:15: instantiated from here /usr/include/boost/archive/detail/oserializer.hpp:566: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’ However, on the workstation side the structs MUST remain 'packed'; otherwise thousands of source files will have to be modified. Is there any way to make this work with boost archives, or should I explore other options? Thanks, Larry