[Serialization] Diamond shaped inheritance and serialization methods specialization

Hi all, I'm having trouble with Boost's serialization library that I'm trying to integrate with an existing class hierarchy that used MFC toolkit as the archiver. It seems that when a serializable class defines a specialized save (or load or serialize for that matter) in addition to the generic method, the serialization library gets confused and ends up not identify properly that the hierarchy of serializable classes uses multiple inheritance and in particular diamond-shaped inheritance. I've reproduced the problem using the test_diamond code example provided with Boost 1.43 using MS VC 9.0 by adding a save method specialized for archive::text_oarchive to the derived1 class defined in test_diamond.cpp. The following diff shows the implementation of this specialized method: -----8<----- --- ../temp/boost_1_43_0/boost_1_43_0/libs/serialization/test/test_diamond.cpp Wed Jul 14 11:28:02 2010 +++ ../serializationProto.cpp Wed Jul 28 13:05:47 2010 @@ -95,6 +97,13 @@ ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(base); } + template<> + void save(boost::archive::text_oarchive &ar, const unsigned int i) const + { + std::cout << "Saving (Text) derived1\n"; + ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(base); + } + template<class Archive> void load(Archive & ar, const unsigned int /* file_version */) { @@ -122,6 +131,7 @@ } BOOST_SERIALIZATION_SPLIT_MEMBER() + }; class final : public derived1, public derived2 { @@ -202,3 +212,219 @@ return EXIT_SUCCESS; } ----->8----- Adding the following function definition to will result in an access violation (see call stack bellow) in access.hpp @ line 136. Any idea as to what is intrinsically wrong with code or how to fix this issue is most welcome. Call stack:
serializationProtoArchiversWrappers.exe!boost::serialization::access::cast_reference<base const ,derived2 const >(const derived2 & u={...}) Line 136 + 0x1a bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::base_object<base,derived2 const >(const derived2 & d={...}) Line 105 + 0x9 bytes C++ serializationProtoArchiversWrappers.exe!derived2::save<boost::archive::text_oarchive>(boost::archive::text_oarchive & ar={...}, const unsigned int __formal=0) Line 134 + 0x9 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::access::member_save<boost::archive::text_oarchive,derived2 const >(boost::archive::text_oarchive & ar={...}, const derived2 & t={...}, const unsigned int file_version=0) Line 94 C++ serializationProtoArchiversWrappers.exe!boost::serialization::detail::member_saver<boost::archive::text_oarchive,derived2>::invoke(boost::archive::text_oarchive & ar={...}, const derived2 & t={...}, const unsigned int file_version=0) Line 43 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::split_member<boost::archive::text_oarchive,derived2>(boost::archive::text_oarchive & ar={...}, derived2 & t={...}, const unsigned int file_version=0) Line 69 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!derived2::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive & ar={...}, const unsigned int file_version=0) Line 144 + 0x34 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::access::serialize<boost::archive::text_oarchive,derived2>(boost::archive::text_oarchive & ar={...}, derived2 & t={...}, const unsigned int file_version=0) Line 119 C++ serializationProtoArchiversWrappers.exe!boost::serialization::serialize<boost::archive::text_oarchive,derived2>(boost::archive::text_oarchive & ar={...}, derived2 & t={...}, const unsigned int file_version=0) Line 74 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::serialize_adl<boost::archive::text_oarchive,derived2>(boost::archive::text_oarchive & ar={...}, derived2 & t={...}, const unsigned int file_version=0) Line 133 + 0x18 bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::oserializer<boost::archive::text_oarchive,derived2>::save_object_data(boost::archive::detail::basic_oarchive & ar={...}, const void * x=0x0034de3c) Line 152 + 0x3e bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::basic_oarchive_impl::save_object(boost::archive::detail::basic_oarchive & ar={...}, const void * t=0x0034de3c, const boost::archive::detail::basic_oserializer & bos={...}) Line 285 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::basic_oarchive::save_object(const void * x=0x0034de3c, const boost::archive::detail::basic_oserializer & bos={...}) Line 434 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::save_standard::invoke<derived2>(boost::archive::text_oarchive & ar={...}, const derived2 & t={...}) Line 259 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::invoke<derived2>(boost::archive::text_oarchive & ar={...}, const derived2 & t={...}) Line 308 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::save<boost::archive::text_oarchive,derived2 const >(boost::archive::text_oarchive & ar={...}, const derived2 & t={...}) Line 525 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::save_override<derived2 const >(const derived2 & t={...}, int __formal=0) Line 69 + 0x15 bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::basic_text_oarchive<boost::archive::text_oarchive>::save_override<derived2 const >(const derived2 & t={...}, int __formal=0) Line 81 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::interface_oarchive<boost::archive::text_oarchive>::operator<<<derived2 const >(const derived2 & t={...}) Line 64 C++ serializationProtoArchiversWrappers.exe!boost::serialization::nvp<derived2 const >::save<boost::archive::text_oarchive>(boost::archive::text_oarchive & ar={...}, const unsigned int __formal=0) Line 80 C++ serializationProtoArchiversWrappers.exe!boost::serialization::access::member_save<boost::archive::text_oarchive,boost::serialization::nvp<derived2 const > const >(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<derived2 const > & t={...}, const unsigned int file_version=0) Line 94 C++ serializationProtoArchiversWrappers.exe!boost::serialization::detail::member_saver<boost::archive::text_oarchive,boost::serialization::nvp<derived2 const > >::invoke(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<derived2 const > & t={...}, const unsigned int file_version=0) Line 43 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::split_member<boost::archive::text_oarchive,boost::serialization::nvp<derived2 const > >(boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<derived2 const > & t={...}, const unsigned int file_version=0) Line 69 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::nvp<derived2 const >::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive & ar={...}, const unsigned int file_version=0) Line 89 + 0x34 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::access::serialize<boost::archive::text_oarchive,boost::serialization::nvp<derived2 const > >(boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<derived2 const > & t={...}, const unsigned int file_version=0) Line 119 C++ serializationProtoArchiversWrappers.exe!boost::serialization::serialize<boost::archive::text_oarchive,boost::serialization::nvp<derived2 const > >(boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<derived2 const > & t={...}, const unsigned int file_version=0) Line 74 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::serialize_adl<boost::archive::text_oarchive,boost::serialization::nvp<derived2 const > >(boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<derived2 const > & t={...}, const unsigned int file_version=0) Line 133 + 0x18 bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::save_only::invoke<boost::serialization::nvp<derived2 const > >(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<derived2 const > & t={...}) Line 245 + 0xf bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::invoke<boost::serialization::nvp<derived2 const > >(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<derived2 const > & t={...}) Line 308 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::save<boost::archive::text_oarchive,boost::serialization::nvp<derived2 const > const >(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<derived2 const > & t={...}) Line 525 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::save_override<boost::serialization::nvp<derived2 const > const >(const boost::serialization::nvp<derived2 const > & t={...}, int __formal=0) Line 69 + 0x15 bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::basic_text_oarchive<boost::archive::text_oarchive>::save_override<boost::serialization::nvp<derived2 const > const >(const boost::serialization::nvp<derived2 const > & t={...}, int __formal=0) Line 81 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::interface_oarchive<boost::archive::text_oarchive>::operator<<<boost::serialization::nvp<derived2 const > const >(const boost::serialization::nvp<derived2 const > & t={...}) Line 64 C++ serializationProtoArchiversWrappers.exe!final::save<boost::archive::text_oarchive>(boost::archive::text_oarchive & ar={...}, const unsigned int __formal=0) Line 159 C++ serializationProtoArchiversWrappers.exe!boost::serialization::access::member_save<boost::archive::text_oarchive,final const >(boost::archive::text_oarchive & ar={...}, const final & t={...}, const unsigned int file_version=0) Line 94 C++ serializationProtoArchiversWrappers.exe!boost::serialization::detail::member_saver<boost::archive::text_oarchive,final>::invoke(boost::archive::text_oarchive & ar={...}, const final & t={...}, const unsigned int file_version=0) Line 43 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::split_member<boost::archive::text_oarchive,final>(boost::archive::text_oarchive & ar={...}, final & t={...}, const unsigned int file_version=0) Line 69 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!final::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive & ar={...}, const unsigned int file_version=0) Line 169 + 0x34 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::access::serialize<boost::archive::text_oarchive,final>(boost::archive::text_oarchive & ar={...}, final & t={...}, const unsigned int file_version=0) Line 119 C++ serializationProtoArchiversWrappers.exe!boost::serialization::serialize<boost::archive::text_oarchive,final>(boost::archive::text_oarchive & ar={...}, final & t={...}, const unsigned int file_version=0) Line 74 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::serialize_adl<boost::archive::text_oarchive,final>(boost::archive::text_oarchive & ar={...}, final & t={...}, const unsigned int file_version=0) Line 133 + 0x18 bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::oserializer<boost::archive::text_oarchive,final>::save_object_data(boost::archive::detail::basic_oarchive & ar={...}, const void * x=0x0034de38) Line 152 + 0x3e bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::basic_oarchive_impl::save_object(boost::archive::detail::basic_oarchive & ar={...}, const void * t=0x0034de38, const boost::archive::detail::basic_oserializer & bos={...}) Line 265 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::basic_oarchive::save_object(const void * x=0x0034de38, const boost::archive::detail::basic_oserializer & bos={...}) Line 434 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::save_standard::invoke<final>(boost::archive::text_oarchive & ar={...}, const final & t={...}) Line 259 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::invoke<final>(boost::archive::text_oarchive & ar={...}, const final & t={...}) Line 308 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::save<boost::archive::text_oarchive,final const >(boost::archive::text_oarchive & ar={...}, const final & t={...}) Line 525 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::save_override<final const >(const final & t={...}, int __formal=0) Line 69 + 0x15 bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::basic_text_oarchive<boost::archive::text_oarchive>::save_override<final const >(const final & t={...}, int __formal=0) Line 81 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::interface_oarchive<boost::archive::text_oarchive>::operator<<<final const >(const final & t={...}) Line 64 C++ serializationProtoArchiversWrappers.exe!boost::serialization::nvp<final>::save<boost::archive::text_oarchive>(boost::archive::text_oarchive & ar={...}, const unsigned int __formal=0) Line 80 C++ serializationProtoArchiversWrappers.exe!boost::serialization::access::member_save<boost::archive::text_oarchive,boost::serialization::nvp<final> const >(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<final> & t={...}, const unsigned int file_version=0) Line 94 C++ serializationProtoArchiversWrappers.exe!boost::serialization::detail::member_saver<boost::archive::text_oarchive,boost::serialization::nvp<final> ::invoke(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<final> & t={...}, const unsigned int file_version=0) Line 43 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::split_member<boost::archive::text_oarchive,boost::serialization::nvp<final> (boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<final> & t={...}, const unsigned int file_version=0) Line 69 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::nvp<final>::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive & ar={...}, const unsigned int file_version=0) Line 89 + 0x34 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::access::serialize<boost::archive::text_oarchive,boost::serialization::nvp<final> (boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<final> & t={...}, const unsigned int file_version=0) Line 119 C++ serializationProtoArchiversWrappers.exe!boost::serialization::serialize<boost::archive::text_oarchive,boost::serialization::nvp<final> (boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<final> & t={...}, const unsigned int file_version=0) Line 74 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::serialize_adl<boost::archive::text_oarchive,boost::serialization::nvp<final> (boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<final> & t={...}, const unsigned int file_version=0) Line 133 + 0x18 bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::save_only::invoke<boost::serialization::nvp<final> (boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<final> & t={...}) Line 245 + 0xf bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::invoke<boost::serialization::nvp<final> (boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<final> & t={...}) Line 308 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::save<boost::archive::text_oarchive,boost::serialization::nvp<final> const >(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<final> & t={...}) Line 525 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::save_override<boost::serialization::nvp<final> const >(const boost::serialization::nvp<final> & t={...}, int __formal=0) Line 69 + 0x15 bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::basic_text_oarchive<boost::archive::text_oarchive>::save_override<boost::serialization::nvp<final> const >(const boost::serialization::nvp<final> & t={...}, int __formal=0) Line 81 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::interface_oarchive<boost::archive::text_oarchive>::operator<<<boost::serialization::nvp<final> const >(const boost::serialization::nvp<final> & t={...}) Line 64 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::pointer_oserializer<boost::archive::text_oarchive,final>::save_object_ptr(boost::archive::detail::basic_oarchive & ar={...}, const void * x=0x0034de38) Line 202 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::basic_oarchive_impl::save_pointer(boost::archive::detail::basic_oarchive & ar={...}, const void * t=0x0034de38, const boost::archive::detail::basic_pointer_oserializer * bpos_ptr=0x005967c8) Line 403 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::basic_oarchive::save_pointer(const void * t=0x0034de38, const boost::archive::detail::basic_pointer_oserializer * bpos_ptr=0x005967c8) Line 442 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_pointer_type<boost::archive::text_oarchive>::polymorphic::save<base>(boost::archive::text_oarchive & ar={...}, base & t={...}) Line 445 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_pointer_type<boost::archive::text_oarchive>::save<base>(boost::archive::text_oarchive & ar={...}, const base & t={...}) Line 460 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_pointer_type<boost::archive::text_oarchive>::invoke<base const *>(boost::archive::text_oarchive & ar={...}, const base * const t=0x0034de38) Line 473 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::save<boost::archive::text_oarchive,base const * const>(boost::archive::text_oarchive & ar={...}, const base * const & t=0x0034de38) Line 525 + 0xf bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::save_override<base const * const>(const base * const & t=0x0034de38, int __formal=0) Line 69 + 0x15 bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::basic_text_oarchive<boost::archive::text_oarchive>::save_override<base const * const>(const base * const & t=0x0034de38, int __formal=0) Line 81 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::interface_oarchive<boost::archive::text_oarchive>::operator<<<base const * const>(const base * const & t=0x0034de38) Line 64 C++ serializationProtoArchiversWrappers.exe!boost::serialization::nvp<base const *>::save<boost::archive::text_oarchive>(boost::archive::text_oarchive & ar={...}, const unsigned int __formal=0) Line 80 C++ serializationProtoArchiversWrappers.exe!boost::serialization::access::member_save<boost::archive::text_oarchive,boost::serialization::nvp<base const *> const >(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<base const *> & t={...}, const unsigned int file_version=0) Line 94 C++ serializationProtoArchiversWrappers.exe!boost::serialization::detail::member_saver<boost::archive::text_oarchive,boost::serialization::nvp<base const *> >::invoke(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<base const *> & t={...}, const unsigned int file_version=0) Line 43 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::split_member<boost::archive::text_oarchive,boost::serialization::nvp<base const *> >(boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<base const *> & t={...}, const unsigned int file_version=0) Line 69 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::nvp<base const *>::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive & ar={...}, const unsigned int file_version=0) Line 89 + 0x34 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::access::serialize<boost::archive::text_oarchive,boost::serialization::nvp<base const *> >(boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<base const *> & t={...}, const unsigned int file_version=0) Line 119 C++ serializationProtoArchiversWrappers.exe!boost::serialization::serialize<boost::archive::text_oarchive,boost::serialization::nvp<base const *> >(boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<base const *> & t={...}, const unsigned int file_version=0) Line 74 + 0x11 bytes C++ serializationProtoArchiversWrappers.exe!boost::serialization::serialize_adl<boost::archive::text_oarchive,boost::serialization::nvp<base const *> >(boost::archive::text_oarchive & ar={...}, boost::serialization::nvp<base const *> & t={...}, const unsigned int file_version=0) Line 133 + 0x18 bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::save_only::invoke<boost::serialization::nvp<base const *> >(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<base const *> & t={...}) Line 245 + 0xf bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::invoke<boost::serialization::nvp<base const *> >(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<base const *> & t={...}) Line 308 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::save<boost::archive::text_oarchive,boost::serialization::nvp<base const *> const >(boost::archive::text_oarchive & ar={...}, const boost::serialization::nvp<base const *> & t={...}) Line 525 + 0xd bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::save_override<boost::serialization::nvp<base const *> const >(const boost::serialization::nvp<base const *> & t={...}, int __formal=0) Line 69 + 0x15 bytes C++ serializationProtoArchiversWrappers.exe!boost::archive::basic_text_oarchive<boost::archive::text_oarchive>::save_override<boost::serialization::nvp<base const *> const >(const boost::serialization::nvp<base const *> & t={...}, int __formal=0) Line 81 C++ serializationProtoArchiversWrappers.exe!boost::archive::detail::interface_oarchive<boost::archive::text_oarchive>::operator<<<boost::serialization::nvp<base const *> const >(const boost::serialization::nvp<base const *> & t={...}) Line 64 C++ serializationProtoArchiversWrappers.exe!test_main(int __formal=1, int __formal=1) Line 210 C++ serializationProtoArchiversWrappers.exe!main(int argc=1, char * * argv=0x0034e198) Line 180 + 0xd bytes C++
-- Robert Bigaignon

Robert Bigaignon wrote:
Hi all,
I'm having trouble with Boost's serialization library that I'm trying to integrate with an existing class hierarchy that used MFC toolkit as the archiver.
It seems that when a serializable class defines a specialized save (or load or serialize for that matter) in addition to the generic method, the serialization library gets confused and ends up not identify properly that the hierarchy of serializable classes uses multiple inheritance and in particular diamond-shaped inheritance.
I've reproduced the problem using the test_diamond code example provided with Boost 1.43 using MS VC 9.0 by adding a save method specialized for archive::text_oarchive to the derived1 class defined in test_diamond.cpp. The following diff shows the implementation of this specialized method:
Without looking at this particular case, I would note that 1.44 - next release contains changes and a new test test_diamond_complex which improves support in this situation. Robert Ramey

On Thu, Jul 29, 2010 at 12:20 PM, Robert Ramey <ramey@rrsd.com> wrote:
Robert Bigaignon wrote:
Hi all,
I'm having trouble with Boost's serialization library that I'm trying to integrate with an existing class hierarchy that used MFC toolkit as the archiver.
It seems that when a serializable class defines a specialized save (or load or serialize for that matter) in addition to the generic method, the serialization library gets confused and ends up not identify properly that the hierarchy of serializable classes uses multiple inheritance and in particular diamond-shaped inheritance.
I've reproduced the problem using the test_diamond code example provided with Boost 1.43 using MS VC 9.0 by adding a save method specialized for archive::text_oarchive to the derived1 class defined in test_diamond.cpp. The following diff shows the implementation of this specialized method:
Without looking at this particular case, I would note that 1.44 - next release contains changes and a new test test_diamond_complex which improves support in this situation.
Robert Ramey
Hi list, Robert, A colleague of mine tried to compile my code with GCC, and it turned out that the C++ I wrote is not legal. The explicit template specialization was not in the correct namespace. The standard says:
An explicit specialization shall be declared in the namespace of which the template is a member, or, for member templates, in the namespace of which the enclosing class or enclosing class template is a member. An explicit specialization of a member function, member class or static data member of a class template shall be declared in the namespace of which the class template is a member
So it seems that my issue comes from the compiler, which did not warn me about writting illegal C++ and, as a result, ended up with some crippled executable. -- Robert Bigaignon
participants (2)
-
Robert Bigaignon
-
Robert Ramey