|
Boost Users : |
From: Dan Leibovich (dan_at_[hidden])
Date: 2007-03-01 17:01:54
Hi again,
I was able to create a minimal test case to reproduce the problem.
I found that the problem occurs when a class includes a pointer to the same type as the class.
I added the following to portable_binary_oarchive.hpp
void save(const unsigned short t){
save_impl(t);
}
void save(const short t){
save_impl(t);
}
and to portable_binary_iarchive.hpp
void load(unsigned short & t){
long l;
load_impl(l, sizeof(unsigned short));
t = l;
}
void load(short & t){
long l;
load_impl(l, sizeof(short));
t = l;
}
The program below fails on asserts:
When the class has virtual method:
boost/archive/basic_binary_iprimitive.hpp:112: void boost::archive::basic_binary_iprimitive<Archive, IStream>::load_binary(void*, unsigned int) [with Archive = portable_binary_iarchive, IStream = std::basic_istream<char, std::char_traits<char> >]: Assertion `static_cast<std::size_t>((std::numeric_limits<std::streamsize>::max)()) >= count' failed.
otherwise:
basic_iarchive.cpp:466: const boost::archive::detail::basic_pointer_iserializer* boost::archive::detail::basic_iarchive_impl::load_pointer(boost::archive::detail::basic_iarchive&, void*&, const boost::archive::detail::basic_pointer_iserializer*, const boost::archive::detail::basic_pointer_iserializer*(*)(const boost::serialization::extended_type_info&)): Assertion `new_cid == cid' failed.
The program:
#include <boost/serialization/access.hpp>
#include "portable_binary_oarchive.hpp"
#include "portable_binary_iarchive.hpp"
#include <fstream>
class A {
public:
int x;
A* a ;
template<class Archive>
void serialize (Archive & ar, const unsigned int version)
{
ar & x ;
ar & a ;
}
A() {}
A(int x_) : x(x_), a(0) {}
virtual void foo() {} ; // if removed - another kind of assert
};
int main() {
char* file = "file" ;
std::ofstream ofs(file) ;
portable_binary_oarchive oar(ofs) ;
const A a(1);
oar << a ;
ofs.close() ;
A aa ;
std::ifstream ifs(file) ;
portable_binary_iarchive iar(ifs) ;
iar >> aa ;
}
Thanks,
Dan Leibovich
-----Original Message-----
From: boost-users-bounces_at_[hidden] [mailto:boost-users-bounces_at_[hidden]] On Behalf Of Robert Ramey
Sent: ã 28 ôáøåàø 2007 22:05
To: boost-users_at_[hidden]
Subject: Re: [Boost-users] [Serialization] issue withportable_binary_oarchive
Hmm- that would seem to suggest that bpis_ptr is NULL or something.
I would guess that browsing the stack trace with the debugger might shed light here. It that doesn't resolve the issue, make a small program that illustrates the problem so I can run it here.
Note that in my previous email, I suggested a change in the one of the libraries headers involving loading and const. It turns out that this change isn't appropriate. I presume you found that as it fails to compile.
I don't think this issue would be affected by moving to a later version.
Robert Ramey
Dan Leibovich wrote:
> Hi,
>
> I have added the specializations methods for short and now the
> serialization output is the same for both platforms (linux and
> solaris).
>
> But when I try to load the dump file, the program received seg fault
> signal in boost::archive::detail::basic_iarchive_impl::load_pointer()
> on: bpis_ptr->load_object_ptr(ar, t, co.file_version);
>
> I will be happy to try any changes you suggest.
>
> I have noticed (according to your code change suggestions) that I do
> not have the latest version of the lib.
> I downloaded boost 1.33.1 , should I download newer version and if so
> how can I do it?
>
> Thanks
> Dan Leibovich
_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net