|
Boost : |
From: David Abrahams (dave_at_[hidden])
Date: 2005-09-04 03:54:12
Hi Robert and Jonathan,
In preparing some slides for a course I'm giving, I've been reading
through the serialization documentation. Although it's generally well
organized and presented, there are a few problems:
1. The menu control doesn't seem to keep the browser's displayed URL
in synch with the location being browsed (FireFox on Windows XP).
Wasn't that a major coup of Jonathan's menu control?
2. Deserialization of derived classes through base class pointers is
an incredibly important subject -- even for many first-time users
-- but the instructions for handling it are buried deep in
Reference > Serializable Concept > Pointers > Pointers to Objects
of Derived Classes
(http://www.boost.org/libs/serialization/doc/serialization.html#derivedpointers)
This material _needs_ to be in the tutorial! In fact, the material
in the reference section is narrative and tutorial in nature, which
seems inappropriate for a reference manual. Maybe you should just
move it?
3. In that reference section, '&' is used repeatedly where only '>>'
is appropriate. For example:
main(){
...
base *b;
ar & b;
}
That can only be confusing.
4. The documentation says that you can write your freestanding
serialize() function in namespace boost::serialization, with the
strong implication that it will work even on compilers that support
ADL. But it won't work unless boost::serialization is an
associated namespace of one of the arguments, as demonstrated by
the following program:
namespace me
{
class X {};
}
namespace boost { namespace serialization
{
template <class T>
int call_serialize(T const& x)
{
serialize(x);
return 0;
}
void serialize(me::X);
}}
int y = boost::serialization::call_serialize(me::X());
As far as I can tell, there's no requirement that any of the
arguments to serialize have boost::serialization as an associated
namespace.
5. Archive Concept Requirements are specified in a completely new,
unprecedented way. I can see why you want to write them this way,
but the result is that it isn't completely clear which elements of
the interface are required and which are optional. For example,
there's a colon after the class name. Does the class need to be
derived from something? What about the names of function and
member template parameters? I know the answer to that one, but a
novice might not. What about the default arguments to member
functions? Is it okay to write overloads?
Also, there's an extra pair of namespace closers in the second
archive concept example.
6. In
http://www.boost.org/libs/serialization/doc/archive_reference.html#implementation
it says:
All input archives should be derived from the following
template:
template<class Archive>
detail::common_iarchive;
but that's nowhere to be found in the archive concept requirements.
Which is it? Also, that "detail::" is actually nested in the
boost::archive namespace, which is not at all clear from the text
there. It's not clear to me why archives should live in a
namespace other than serialization; if they were in
boost::serialization *and* users were required to derive from one
of the archive types, that would solve problem 4.
-- Dave Abrahams Boost Consulting www.boost-consulting.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk