[Serialization] Registering containers of user-provided types
I am writing a library that will handle storing and serializing user-defined types. The user-defined types are required to be themselves serializable. However the library uses templates to create containers of user types. These containers are then serialized through a base class pointer. I don't know how to export the container types to boost::serialization through the templates. The only way I can do it is to force the user of the library to BOOST_CLASS_EXPORT_GUID() every container type. I've tried unpacking the macro by looking at boost/serialization/export.hpp, but it is slightly complex... Is there a way to export a class as part of the template instantiation? Or another way to write the library to easily serialize containers of user-defined types? Thanks -v Example code: #include <iostream> #include <vector> #include <boost/foreach.hpp> #include <boost/serialization/access.hpp> #include <boost/serialization/vector.hpp> #include <boost/serialization/base_object.hpp> #include <boost/serialization/export.hpp> #include <boost/archive/text_oarchive.hpp> ////////////////////////////////////////////////////////////////////////////// // Example code that would reside in the library ////////////////////////////////////////////////////////////////////////////// struct type_container_base { private: virtual void make_abstract() const {} friend class ::boost::serialization::access; template <typename ARCHIVE> void serialize(ARCHIVE &, const unsigned int) {} }; BOOST_SERIALIZATION_ASSUME_ABSTRACT(type_container_base) template <typename USER_TYPE> struct type_container : type_container_base { void add(const USER_TYPE& d) { _vector.push_back(d); } private: std::vector<USER_TYPE> _vector; friend class ::boost::serialization::access; template <typename ARCHIVE> void serialize(ARCHIVE & ar, const unsigned int) { ar & ::boost::serialization::base_object<type_container_base>(*this); ar & _vector; } }; ////////////////////////////////////////////////////////////////////////////// // Example user code that would use the library ////////////////////////////////////////////////////////////////////////////// struct user_type { user_type(int i) : _val(i) {} private: int _val; friend class ::boost::serialization::access; template <typename ARCHIVE> void serialize(ARCHIVE & ar, const unsigned int) { ar & _val; } }; // *** Is there a better way than forcing the user to do this for every // *** user_type they want to use with the library? BOOST_CLASS_EXPORT_GUID(type_container<user_type>, "type_container<user_type>") int main() { std::vector<type_container_base*> containers; type_container<user_type>* tc = new type_container<user_type>(); tc->add(user_type(7)); tc->add(user_type(42)); tc->add(user_type(1776)); containers.push_back(tc); { boost::archive::text_oarchive ar(std::cout); const std::size_t size = containers.size(); ar << size; BOOST_FOREACH(type_container_base* p, containers) ar << p; } return 0; }
Vivek wrote:
I am writing a library that will handle storing and serializing user-defined types. The user-defined types are required to be themselves serializable.
However the library uses templates to create containers of user types.
So far so good - look at the serialization implementions for std::vector<T> and others.
These containers are then serialized through a base class pointer. I don't know how to export the container types to boost::serialization through the templates. The only way I can do it is to force the user of the library to BOOST_CLASS_EXPORT_GUID() every container type.
That would be the way to do it. However, someone proposed a solution to this problem and uploaded it as a track item. I found it intriguing, But I decided not to implement it to keep the library from getting any more complicated than it already is. You might want to paste this proposed enhancement into your own code.
I've tried unpacking the macro by looking at boost/serialization/export.hpp, but it is slightly complex.
lol - this is an understatement
Is there a way to export a class as part of the template instantiation? Or another way to write the library to easily serialize containers of user-defined types?
The rub here is your requirement that it be exported through a base class pointer. Were it not for this, it is easily done just like standard containers are. Robert Ramey
participants (2)
-
Robert Ramey
-
Vivek