|
Boost : |
From: Joaquín Mª López Muñoz (joaquin_at_[hidden])
Date: 2007-09-06 05:04:46
Robert Ramey ha escrito:
> I put the archive helper in as an ad hoc solution to a particular problem.
> I was always unsatisfied with it as I didn't like the idea of decorating
> the main serialization library code with special cases. Its my belief
> that this is what makes libraries die of old age.
As I see it, the helper interface does not litter the serialization code, it
merely provides an extension API for users implementing non-trivial
serialization schemes --note that the helper themselves are not part
of B.S but belong in the different serializable types, much like the
associated serialize() functions.
> However, at the time it seemed expedient so I included it for this one
> case (shared pointer) and left it undocumented on purpose.
>
> Eventually I found what to me is a much better solution
> and this is implemented in the next release. This is
> to use multiple inheritance to add the helper in as a mix-in.
> This is the way I plan to support this kind of thing in
> the future. It doesn't change the published API of the
> serialization library itself. However I will add a
> section in the documentation - if its not already there
> describing this technique.
>
> I believe that using mix-in to ad helpers will be
> equivalent to adding them in at runtime as they are now.
>
> I included the shared_ptr helper mix-in in the in the
> library in order to not change the current api and
> in recognition of shared_ptrs priviledged status
> as a boost component.
>
> I didn't expect anyone to notice this change, as
> no one had posted a problem which required
> helpers and it was undocumented.
>
With all due respect (and admiration for your great lib) I think the mix-in
idea has many flaws as compared with the former helper interface. Let
me state several points supporting my thesis and addressing some of
the claims you make above; I'd be grateful if you could discuss them with
me:
1. You state that the mix-in approach "doesn't change the published API
of B.S". I don't think so: if I decide to implement an Archive type I must
explicitly handle shared_ptr (or decide not to do it, I guess this is what
your naked_* archive versions are for), so definitely this shows through
the API I'm expected to implement.
2. Having an ad-hoc extension for one particular type seems to me a
recipe for disaster. Consider the following: some environments are
already providing std::tr1::shared_ptr, which of course does not have
built-in serialization capabilities. How am I supposed to serialize this?
Are you going to add another mix-in to your Archive classes to handle
this as well?
3. You say that adding mix-ins is equivalent to adding helpers, but I think
the approaches are radically different. Addition of a mix-in is
a. made at compile time
b. part of the implementation of the archive
while addition of a helper is
a. made at run-time
b. part of the serialization code for a type
Mix-in are closed for extension where helpers are open: If I need
a helper for serializing some T and I'm using an Archive whitout
special support for that T, all hope is lost.
4. IMHO the helper API in B.S 1.34 is a simple yet powerful capability,
and does not look forced or clumsy at all. It simply provides a way
to add state info to an archive object, which is in a sense a state machine
transtitioning its way during the serialization process. I contend that
helpers allow for implementing serialization for types which otherwise
would be impossible to serialize or should rely on inefficient detours:
a. boost::shared_ptr (unless adhoc provisions are made)
b. std::tr1::shared_ptr
c. STL containers iterators.
d. The lib I'm writing, which is the original cause why I started this
thread, provides a class called flyweight<T> where flyweights with the
same value share their representation by holding internal pointers to the
same T value. Serializating this is trivial with the aid of a saving helper
that maps T*s to flyweight<T>s --without helpers, the best I can come
up with involves T duplication in the serialization stream and inefficient
creation of flyweights on saving time.
Of course I'm aware helpers were undocumented and I was basically
using them at my own risk, so I'm not complaining about my code
being broken by the switch from B.S 1.34 to trunk, I just want to convince
you that helpers are indeed a useful general-purpose capability that should
be made public, and that the proposed mix-in alternative is flawed.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk