Maxime van Noppen wrote:
On 08/18/2010 04:04 PM, Robert Ramey wrote:
make a small example which illustrates the problem and we'll take a
look a it.
In the first post I attached such an example.
I went back and looked at your example. You're on the wrong track here.
First, classes to be serialized should be not dependent in anyway upon
any archive class. So use:
class unit
{
public:
unit() : id_(0) { }
unit(int id) : id_(id) { }
template <typename Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(id_);
}
private:
int id_;
};
note that "polymorphism" is not implemented via virtual functions in the
archive class itself so your archive should be dependent on whether or note
you're using the polymorphic_archive template.
class test_oarchive : public
boost::archive::detail::common_oarchive
{
friend class boost::archive::save_access;
friend class boost::archive::detail::interface_oarchive;
public:
test_oarchive(std::ostream& out, unsigned int = 0) : out_(out){ }
void save_binary(const void* address, std::size_t count) {
out_.write(static_cast(address), count); }
template <typename T>
void save(const T& t){
out_ << t;
}
template <class T>
void save_override(const boost::serialization::nvp<T>& nvp, int f)
{
out_ << "";
typedef boost::archive::detail::common_oarchive
detail_common_oarchive;
this->detail_common_oarchive::save_override(nvp.const_value(), f);
out_ << "\n";
}
void save_override(const boost::archive::object_id_type & t, int) { }
void save_override(const boost::archive::object_reference_type & t, int)
{ }
void save_override(const boost::archive::version_type & t, int) { }
void save_override(const boost::archive::class_id_type & t, int) { }
void save_override(const boost::archive::class_id_optional_type & t,
int) { }
void save_override(const boost::archive::class_id_reference_type & t,
int) { }
void save_override(const boost::archive::class_name_type & t, int) { }
void save_override(const boost::archive::tracking_type & t, int) { }
private:
std::ostream& out_;
};
Test the above to verify that it works according to your taste.
Now use a "templated typedef" to generate the polymorphic version:
#include
#include
#include
typedef boost::archive::detail::polymorphic_oarchive_route<
test_oarchive
polymorphic_test_oarchive;
// required by export
BOOST_SERIALIZATION_REGISTER_ARCHIVE(
test_oarchive
)
or something like this. Now you should have test_oarchive and
polymorphic_test_oarchive
Robert Ramey