[serialization] Can one deserialize a derived classes via pointers to the base class using polymorphic archives in a DLL context?

Hi all, I am trying to upgrade to boost 1.42 using Visual Studio 2008 and I have difficulties using serialization with polymorphic archives in a DLL setup. I would like to encapsulate in one DLL the class serialization functionality based on a polymorphic base archive. In another place, I would like to perform the actual serialization/deserialization using a specific archive (e.g., polymorphic_text_[io]archive). The section "Special Considerations" of the documentation indicates in two paragraphs ("DLLS - Serialization and Runtime Linking" and " Plugins") that this scenario is supported by the library. However I couldn't find any example that shows how to do that. Therefore, I changed slightly the boost test that includes test_dll_exported.cpp and polymorphic_derived2.cpp as follows: 1. I moved the classes polymorphic_base and polymorphic_derived1 to the project polymorphic_derived2 This way, we have one place where those classes serialize their members (i.e., polymorphic_derived2.dll) and a separate binary where we serialize them via a derived archive (i.e., test_main() inside test_dll_exported.exe); 2. I replaced the template version of the serialization functions with the equivalent version based on boost::archive::polymorphic_[io]archives. I also removed the text-based instantiation inside the Dll. As indicated in the boost documentation, the class serialization will only have to be compiled once for all archive implementations (present or future). Therefore, the DLL should contain only the serialization functions to the base polymorphic archives. While everything builds correctly, at run time I get a C++ exception BEFORE main() in basic_serializer_map.cpp around the line 48: // if this fails, it's because it's been instantiated // in multiple modules - DLLS - a recipe for problems. // So trap this here if(!result.second){ boost::serialization::throw_exception( archive_exception( archive_exception::multiple_code_instantiation, bs->get_debug_info() ) ); } Please note BOOST_CLASS_EXPORT_IMPLEMENT is used only once per class (inside polymorphic_derived2.cpp), yet the serializers are inserted in the same map both from the Dll and from the executable. Am I doing something wrong? Has anyone been able to create a similar working example? I really appreciate any feedback I could get. Thank you, Bogdan PS For more info I attached the files describing my problem plus the .sln file (I used the configuration "Debug runtime-dynamic threading-multi")

Bogdan wrote:
As indicated in the boost documentation, the class serialization will only have to be compiled once for all archive implementations (present or future). Therefore, the DLL should contain only the serialization functions to the base polymorphic archives.
While everything builds correctly, at run time I get a C++ exception BEFORE main() in basic_serializer_map.cpp around the line 48:
// if this fails, it's because it's been instantiated // in multiple modules - DLLS - a recipe for problems. // So trap this here if(!result.second){ boost::serialization::throw_exception( archive_exception( archive_exception::multiple_code_instantiation, bs->get_debug_info() ) ); }
Please note BOOST_CLASS_EXPORT_IMPLEMENT is used only once per class (inside polymorphic_derived2.cpp), yet the serializers are inserted in the same map both from the Dll and from the executable.
Am I doing something wrong? Has anyone been able to create a similar working example? I really appreciate any feedback I could get.
It looks like polymorphic_derived2.cpp is being included in both the mainline as well as the DLL. It's not clear that polymorphic_base needs to be n the DLL and probably shouldn't be. Make sure that your header includes BOOST_CLASS_EXPORT_KEY and not BOOST_CLASS_EXPORT. finally, make sure that the test for this facility works. Robert Ramey
participants (2)
-
Bogdan
-
Robert Ramey