Opened 17 years ago
Closed 17 years ago
#456 closed Bugs (Fixed)
1.33RC2: archive_pointer_[o/i]serializer assert problem
Reported by: | nobody | Owned by: | Robert Ramey |
---|---|---|---|
Milestone: | Component: | serialization | |
Version: | None | Severity: | |
Keywords: | Cc: |
Description
Hello again, FYI .. i read the boost mailing list, so posting anwers there is ok for me ;-) I made some progress after reading "rationale" though some things still give headaches. I have polymorphic class hierarchy which gets serialized thru base ptrs (along with shared_ptr stuff). When using portable_binary_oarchive/iarchive (taken from boost example) an assert() triggers which raises some questions. oserializer.hpp: -------------- snip -------------- // sice true_type is valid, and this only gets made if the // pointer oserializer object has been created, this should never fail bpos_ptr = archive_pointer_oserializer<Archive>::find(* true_type); assert(NULL != bpos_ptr); if(NULL == bpos_ptr) boost::throw_exception( archive_exception(archive_exception::unregistered_class) ); -------------- snip -------------- "should never fail" seems to fail and i dont know why ;-( (long callstack omitted) > test_protocollayers.exe!boost::archive::detail::save_pointer_type<portable_binary_oarchive,xxx::ProtocolHeader const *>::polymorphic<xxx::ProtocolHeader>::save(portable_binary_oarchive & ar={...}, const xxx::ProtocolHeader & t={...}, const boost::archive::detail::basic_pointer_oserializer * bpos_ptr=0x00000000) Line 416 C++ test_protocollayers.exe!boost::archive::detail::save_pointer_type<portable_binary_oarchive,xxx::ProtocolHeader const *>::save<xxx::ProtocolHeader>(portable_binary_oarchive & ar={...}, const xxx::ProtocolHeader & t={...}, const boost::archive::detail::basic_pointer_oserializer * bpos_ptr=0x00000000) Line 438 + 0x11 C++ test_protocollayers.exe!boost::archive::detail::save_pointer_type<portable_binary_oarchive,xxx::ProtocolHeader const *>::invoke(portable_binary_oarchive & ar={...}, const xxx::ProtocolHeader * const t=0x00680698) Line 466 + 0x11 C++ test_protocollayers.exe!boost::archive::save<portable_binary_oarchive,xxx::ProtocolHeader const *>(portable_binary_oarchive & ar={...}, const xxx::ProtocolHeader * const & t=0x00680698) Line 535 + 0xf C++ The classes usually contain: "template<class Archive> void serialize( Archive & ar, const unsigned int /* version */)" stuff, along with explicit: "boost::serialization::void_cast_register<Derived, Base>(0,0);" in ctors (or it doesnt work). "this_type" = abstract base "true_type" = derived both classes are successfully retrieved via type info (registered class). The "vp = serialization::void_downcast(*true_type, *this_type, &t);" works too (because the void_cast_register). But it doesnt find appropriate basic_pointer_oserializer .... I placed a breakpoint at "basic_serializer_map::insert(const basic_serializer * bs)" to see what types get registered at startup (initterm ctors). There are indeed registrations but some (derived) types are missing. What gives? BTW ... could you make "portable_binary_oarchive" (and iarchive) included in available boost archive types? I find it useful because serialization is used in cross platform protocol stacks (little vs. big endian archs). Is there any chance to reduce binary overhead due to registration data (shared_ptr/type info ... binary size almost doubled due to contained type info in small payloads). Can stringified type info be omitted/shortened (i use hierachial namespaces which blow the length)? Regards, A. Focht
Change History (3)
comment:2 by , 17 years ago
Logged In: YES user_id=396141 polymorphic archives had a problem which I believe is now fixed on 1.33.1 There are indeed registrations but some (derived) types are missing. What gives? I believe all issues of this nature have been fixed and are resolved in verision 1.33.1 could you make "portable_binary_oarchive" (and iarchive) included in available boost archive types? I find it useful because serialization is used in cross platform protocol stacks (little vs. big endian archs). feel free to promote yourself by adding floating/double and uploading to the boost vault. The mailing list contained code ofr implementing portable floats in an elegant way. You might track this down and add it in. The class name (from BOOST_CLASS_EXPORT) is only included once in the archive. If the size of the archive doubled I would look more deeply to find the reason. Check serialization traits. Robert Ramey
comment:3 by , 17 years ago
Status: | assigned → closed |
---|
Logged In: YES user_id=1312539 This Tracker item was closed automatically by the system. It was previously set to a Pending status, and the original submitter did not respond within 14 days (the time period specified by the administrator of this Tracker).
Note:
See TracTickets
for help on using tickets.