Re: [Boost-users] [serialization] Polymorphic serialization with polymorphic archives problem...

Hi, I have the same scenario, and it's not a problem. If i understand (my english is poor, sorry) well. But there is differences: - I use GCC compilers (but boost is portable). - I use static linking. Probably this differences should not have consequences on the result. I didn't read your code... Had you follow this rules ? - Register child class (a simple way is using the BOOST_CLASS_EXPORT macro). - In the serialize method of your child class, call the serialization of parent's class (optional). I use BOOST_SERIALIZATION_BASE_OBJECT's macro.
If you register child class it should be ok... Regards, Damien.
Hi Damien, My reply has not been posted in gmane so I try again: Thank you for your quick reply. I believe I followed the rules: 1. polymorphic_derived1 and polymorphic_derived2 do include the serialization of the base class via "ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base); " 2. there is no usage of BOOST_CLASS_EXPORT ( and there shouldn't be any: according to the documentation, in a dll setup one must declare BOOST_CLASS_EXPORT_KEY in the headers containing the classes to be serialized and BOOST_CLASS_EXPORT_IMPLEMENT in the .cpp files). In my example, there are exactly three declarations of BOOST_CLASS_EXPORT_KEY: one in polymorphic_base.hpp, and two in polymorphic_derived2.hpp one for polymorphic_derived1 and another for polymorphic_derived2. Similarly, there are only three usages of BOOST_CLASS_EXPORT_IMPLEMENT. 3. for deeper hierarchies where every class can be potentially serialized, one should probably register all the classes and not just the most derived children. I have the feeling that the type of deployment (dll vs exe) is the crux of the problem. For that, I created four different scenarios with the same source files and I got the following results: 1. all files in one exe with the serialization library linked statically - WORKS AS EXPECTED. 2. all files in one exe with the serialization library linked as a dll - WORKS AS EXPECTED. 3. serialization files in a separate dll. Both the main executable and my dll link with the dll version of the serialization library: main.exe my_serialization.dll boost_serialization.dll my_serialization.dll boost_serialization.dll Builds OK but FAILS at runtime , at run time I get a C++ exception BEFORE main() in basic_serializer_map.cpp around the line 48: 'archive_exception::multiple_code_instantiation with the message "code instantiated in more than one module - polymorphic_base"' 4. serialization files in a separate dll. Both the main executable and my dll link with the static version of the serialization library: main.exe my_serialization.dll boost_serialization.lib my_serialization.dll boost_serialization.lib Builds OK but FAILS at runtime while trying to serialize with the following exception thrown in oserializer.hpp(line 424):struct polymorphic::save(): 'unregistered void cast class polymorphic_derived1<-polymorphic_base in function 'int __cdecl main(int,char *[])'' The source code in the scenarios above is identical with the exception of dllexport/dllimport declaration needed for dlls. Whenever the serialization code is relegated to a different library it seems there are problems with boost serialization: - if boost is linked as a static lib into a user dll, the class serializers do not get registered at all with their associated map singleton. - if boost is linked as a dynamic lib into a user dll, the class serializers register twice with the map singleton of the polymorphic base archive. I don't want to add them here but I can provide any of the projects above to those interested. Thank you all, Bogdan

Bogdan wrote:
3. serialization files in a separate dll. Both the main executable and my dll link with the dll version of the serialization library:
main.exe my_serialization.dll boost_serialization.dll
my_serialization.dll boost_serialization.dll
Builds OK but FAILS at runtime , at run time I get a C++ exception BEFORE main() in basic_serializer_map.cpp around the line 48:
'archive_exception::multiple_code_instantiation with the message "code instantiated in more than one module - polymorphic_base"'
This would indicate that the serialization for polymorphic_base is included in BOTH the mainline and the DLL. Check that the serialization function is NOT an inline definition. the polymorphic_base.cpp should only be needed when compiling the DLL. option 1 include serialization definition for polymorphic_base in my_serialization.dll option 2 include serialization definition for polymorphic_base in it's own dll.
4. serialization files in a separate dll. Both the main executable and my dll link with the static version of the serialization library:
main.exe my_serialization.dll boost_serialization.lib
my_serialization.dll boost_serialization.lib
Builds OK but FAILS at runtime while trying to serialize with the following exception thrown in oserializer.hpp(line 424):struct polymorphic::save():
'unregistered void cast class polymorphic_derived1<-polymorphic_base in function 'int __cdecl main(int,char *[])''
This is probably failing due to the compiler stripping out code not explicitly referred to. Since it's not referrred to, the linking doesn't include it from the library. Robert Ramey
participants (2)
-
Bogdan
-
Robert Ramey