[serialization] Trouble serializing a bitfield

Following is a very short program to test serialization along with the g++ output when compiling it. My problem arises when I try to write a serialization function for a bitfield. As the compiler output shows, the bitfield is the cause of this problem. How should one serialize a bitfield? Have I made some mistake in this code? I can get seriailziation to work if I instead use a save() and load() function that copies each bit to an int before archiving but I'm unsure if this is the best way. #include <stdlib.h> #include <string> #include <iostream> #include <sstream> #include <boost/archive/archive_exception.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/serialization/export.hpp> #include <boost/serialization/serialization.hpp> #include <boost/serialization/list.hpp> class Event { friend class boost::serialization::access; template<class Archive> void serialize(Archive &ar, const int version) { ar & bits; ar & field1; }; public: struct s { friend class boost::serialization::access; template<class Archive> void serialize(Archive &ar, const int version) { ar & spare1; }; int spare1 : 1; } bits; int field1; }; main(int argc, char **argv) { Event *evt = new Event; evt->field1 = 0x1234; std::stringstream ofs; boost::archive::binary_oarchive oa(ofs); oa & *evt; // serialize the event } serial2.cpp: In member function 'void Event::s::serialize(Archive&, int) [with Archive = boost::archive::binary_oarchive]': boost/serialization/access.hpp:109: instantiated from 'static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::binary_oarchive, T = Event::s]' boost/serialization/serialization.hpp:81: instantiated from 'void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::binary_oarchive, T = Event::s]' boost/serialization/serialization.hpp:140: instantiated from 'void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::binary_oarchive, T = Event::s]' boost/archive/detail/oserializer.hpp:147: instantiated from 'void boost::archive::detail::oserializer<Archive, T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const [with Archive = boost::archive::binary_oarchive, T = Event::s]' serial2.cpp:43: instantiated from here serial2.cpp:29: error: cannot bind bitfield '((Event::s*)this)->Event::s::spare1' to 'int&'

Ken Roser wrote: ...
How should one serialize a bitfield?
There are a couple of ideas in the vault.
Have I made some mistake in this code?
without actually trying the code I would make the following changes to the test: Robert Ramey
#include <stdlib.h> #include <string> #include <iostream> #include <sstream>
#include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp>
class Event { friend class boost::serialization::access; template<class Archive> void serialize(Archive &ar, const int version) { ar & bits; ar & field1; }; public: struct s { friend class boost::serialization::access; template<class Archive> void serialize(Archive &ar, const int version) { ar & spare1; // error here as no serialization has been defined for bit fields }; int spare1 : 1; } bits; int field1; };
main(int argc, char **argv) { Event evt; evt.field1 = 0x1234;
std::stringstream ofs; boost::archive::binary_oarchive oa(ofs); oa & evt; // serialize the event }

http://boost-consulting.com/vault/ look in "serialization" Robert Ramey Markus Werle wrote:
Robert Ramey <ramey <at> rrsd.com> writes:
Ken Roser wrote: ...
How should one serialize a bitfield?
There are a couple of ideas in the vault.
Where exactly?
Markus
participants (3)
-
Ken Roser
-
Markus Werle
-
Robert Ramey