// Compiled with: // > g++ serializer.cxx -lboost_serialization // Compiler Version: gcc version 4.1.2 20061115 (prerelease) (SUSE Linux) // Boost Version: boost-1.33.1-42 (SuSE-RPM) // BEGIN serializer.hxx header file #ifdef BOOST_ARCHIVE_KNOWN_ARCHIVE_TYPES_HPP #error boost/archive/detail/known_archive_types.hpp wurde zu frueh eingebunden #endif #ifdef BOOST_ARCHIVE_CUSTOM_OARCHIVE_TYPES #error BOOST_ARCHIVE_CUSTOM_OARCHIVE_TYPES wurde bereits verwendet #endif #ifdef BOOST_ARCHIVE_CUSTOM_IARCHIVE_TYPES #error BOOST_ARCHIVE_CUSTOM_IARCHIVE_TYPES wurde bereits verwendet #endif #define BOOST_ARCHIVE_CUSTOM_OARCHIVE_TYPES ::image::BinaryWriter #define BOOST_ARCHIVE_CUSTOM_IARCHIVE_TYPES ::image::BinaryReader #include #include #include #include #include #include #define LOG_THROW(EXC, MSG) throw EXC; namespace image { class BinaryWriter: public boost::archive::detail::common_oarchive { public: BinaryWriter(std::ostream& os): boost::archive::detail::common_oarchive(0), _os(os) { } void save_binary(const void *address, std::size_t size) { if (!_os.write((const char*)address, size)) LOG_THROW(std::runtime_error("Cannot write binary image file!"), (boost::format ("Bad file stream. Cannot write %1% bytes:\n%2%") %size%logger::binary((const char*)address, size)) .str()); }; template void save_override(const T& t, int) { boost::archive::save(*this, t); } void save_override(const boost::archive::version_type&, int) {} void save_override(const boost::archive::object_id_type&, int) {} void save_override(const boost::archive::class_id_type&, int) {} void save_override(const boost::archive::class_id_optional_type&, int) {} void save_override(const boost::archive::class_id_reference_type&, int) {} void save_override(const boost::archive::tracking_type&, int) {} private: template void save(const T &t) { save_binary(&t, sizeof(T)); } friend class boost::archive::save_access; private: std::ostream& _os; }; class BinaryReader: public boost::archive::detail::common_iarchive { public: BinaryReader(std::istream& is): boost::archive::detail::common_iarchive(0), _is(is) { } virtual ~BinaryReader() {} template void load_override(T& t, int) { boost::archive::load(*this, t); } void load_override(boost::archive::version_type&, int) {} void load_override(boost::archive::object_id_type&, int) {} void load_override(boost::archive::class_id_type&, int) {} void load_override(boost::archive::class_id_optional_type&, int) {} void load_override(boost::archive::class_id_reference_type&, int) {} void load_override(boost::archive::tracking_type&, int) {} void load_binary(void *address, std::size_t size) { if (!_is.read((char*)address, size)) LOG_THROW(std::runtime_error("Cannot read binary image file!"), (boost::format("Bad file stream, cannot read %1% bytes") %size).str()); }; private: template void load(T &t) { load_binary(&t, sizeof(T)); } friend class boost::archive::load_access; private: std::istream& _is; }; } // This is the last line in the serializer.hxx header, because it // requires to kown the declaration of ::image::BinaryReader and // ::image::BinaryWriter. #include // END header file // print binary data #include #include #include inline std::string binary(const std::string& s) { std::string::size_type size(s.size()); std::string result; std::string txt; std::auto_ptr hex(new std::stringstream); for (std::string::size_type i(0); i=32&&(unsigned char)s[i]<128)?s[i]:'.'; if (i%10==9) { result+=hex->str()+txt+"\n"; // Stupid std::stringstream has no way to clear buffer... hex = std::auto_ptr(new std::stringstream); txt.clear(); } } if (txt.size()) result+=hex->str()+std::string(30-hex->str().size(), ' ')+txt+"\n"; return result; } // Stream a string binary #include #include namespace boost { namespace serialization { template void serialize(Archive& ar, std::string& s, const unsigned int v) { split_free(ar, s, v); } template void save(Archive& ar, const std::string& s, const unsigned int) { int sz(s.size()); ar & sz; ar.save_binary((const void*)s.begin().operator->(), s.size()); } template void load(Archive& ar, std::string& s, const unsigned int) { std::string::size_type sz; ar & sz; s.resize(sz); ar.load_binary((void*)s.begin().operator->(), s.size()); } } } //--> This is the new part ****************************************************** class A { public: friend class boost::serialization::access; template void serialize(ARCHIVE& ar, const unsigned int version) { } }; BOOST_CLASS_EXPORT(A); // Without this line, it works! /* With this line, the following happens: > g++ serializer.cxx -lboost_serialization /tmp/ccbTxdyM.o: In function `boost::archive::detail::pointer_oserializer::~pointer_oserializer()': serializer.cxx:(.text._ZN5boost7archive6detail19pointer_oserializerI1AN5image12BinaryWriterEED1Ev[boost::archive::detail::pointer_oserializer::~pointer_oserializer()]+0x17): undefined reference to `boost::archive::detail::archive_pointer_oserializer::~archive_pointer_oserializer()' /tmp/ccbTxdyM.o: In function `boost::archive::detail::pointer_oserializer::~pointer_oserializer()': serializer.cxx:(.text._ZN5boost7archive6detail19pointer_oserializerI1AN5image12BinaryWriterEED0Ev[boost::archive::detail::pointer_oserializer::~pointer_oserializer()]+0x17): undefined reference to `boost::archive::detail::archive_pointer_oserializer::~archive_pointer_oserializer()' /tmp/ccbTxdyM.o: In function `boost::archive::detail::pointer_iserializer::~pointer_iserializer()': serializer.cxx:(.text._ZN5boost7archive6detail19pointer_iserializerI1AN5image12BinaryReaderEED1Ev[boost::archive::detail::pointer_iserializer::~pointer_iserializer()]+0x17): undefined reference to `boost::archive::detail::archive_pointer_iserializer::~archive_pointer_iserializer()' /tmp/ccbTxdyM.o: In function `boost::archive::detail::pointer_iserializer::~pointer_iserializer()': serializer.cxx:(.text._ZN5boost7archive6detail19pointer_iserializerI1AN5image12BinaryReaderEED0Ev[boost::archive::detail::pointer_iserializer::~pointer_iserializer()]+0x17): undefined reference to `boost::archive::detail::archive_pointer_iserializer::~archive_pointer_iserializer()' /tmp/ccbTxdyM.o: In function `boost::archive::detail::pointer_oserializer::pointer_oserializer()': serializer.cxx:(.text._ZN5boost7archive6detail19pointer_oserializerI1AN5image12BinaryWriterEEC1Ev[boost::archive::detail::pointer_oserializer::pointer_oserializer()]+0x17): undefined reference to `boost::archive::detail::archive_pointer_oserializer::archive_pointer_oserializer(boost::serialization::extended_type_info const&)' serializer.cxx:(.text._ZN5boost7archive6detail19pointer_oserializerI1AN5image12BinaryWriterEEC1Ev[boost::archive::detail::pointer_oserializer::pointer_oserializer()]+0x62): undefined reference to `boost::archive::detail::archive_pointer_oserializer::~archive_pointer_oserializer()' /tmp/ccbTxdyM.o: In function `boost::archive::detail::pointer_oserializer::pointer_oserializer()': serializer.cxx:(.text._ZN5boost7archive6detail19pointer_oserializerI1AN5image12BinaryWriterEEC2Ev[boost::archive::detail::pointer_oserializer::pointer_oserializer()]+0x17): undefined reference to `boost::archive::detail::archive_pointer_oserializer::archive_pointer_oserializer(boost::serialization::extended_type_info const&)' serializer.cxx:(.text._ZN5boost7archive6detail19pointer_oserializerI1AN5image12BinaryWriterEEC2Ev[boost::archive::detail::pointer_oserializer::pointer_oserializer()]+0x62): undefined reference to `boost::archive::detail::archive_pointer_oserializer::~archive_pointer_oserializer()' /tmp/ccbTxdyM.o: In function `boost::archive::detail::pointer_iserializer::pointer_iserializer()': serializer.cxx:(.text._ZN5boost7archive6detail19pointer_iserializerI1AN5image12BinaryReaderEEC1Ev[boost::archive::detail::pointer_iserializer::pointer_iserializer()]+0x17): undefined reference to `boost::archive::detail::archive_pointer_iserializer::archive_pointer_iserializer(boost::serialization::extended_type_info const&)' serializer.cxx:(.text._ZN5boost7archive6detail19pointer_iserializerI1AN5image12BinaryReaderEEC1Ev[boost::archive::detail::pointer_iserializer::pointer_iserializer()]+0x62): undefined reference to `boost::archive::detail::archive_pointer_iserializer::~archive_pointer_iserializer()' /tmp/ccbTxdyM.o: In function `boost::archive::detail::pointer_iserializer::pointer_iserializer()': serializer.cxx:(.text._ZN5boost7archive6detail19pointer_iserializerI1AN5image12BinaryReaderEEC2Ev[boost::archive::detail::pointer_iserializer::pointer_iserializer()]+0x17): undefined reference to `boost::archive::detail::archive_pointer_iserializer::archive_pointer_iserializer(boost::serialization::extended_type_info const&)' serializer.cxx:(.text._ZN5boost7archive6detail19pointer_iserializerI1AN5image12BinaryReaderEEC2Ev[boost::archive::detail::pointer_iserializer::pointer_iserializer()]+0x62): undefined reference to `boost::archive::detail::archive_pointer_iserializer::~archive_pointer_iserializer()' collect2: ld returned 1 exit status */ //******************************************************************************* // main, test the whole thing... #include int main(int, char const*const*const) try { std::string s("Hallo Welt!"); int i(4712); std::stringstream ss; image::BinaryWriter out(ss); out & s & i; std::cout<<"Stream contains: "<