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.
