Boost logo

Boost :

Subject: Re: [boost] [serialization] string serialization
From: Nikolay Mladenov (nikolay.mladenov_at_[hidden])
Date: 2009-03-04 13:12:02


Considering your portability context (mine is even narrower):
1. the binary_archives already serialize
boost::serialization::collection_size_type as unsigned int(uint32_t
would still be better).
2.All this code will be unnecessary if the string serialization is not
using "plain longs".

On Wed, Mar 4, 2009 at 8:24 AM, troy d. straszheim <troy_at_[hidden]> wrote:
> Robert Ramey wrote:
>>
>> Nope,  It's not intentional.
>>
>> I don't remember why it is the way it is.  Collections evolved
>> to become more efficient and in the process collection_size_type
>> came into being.  Since std::string was already primitive and had
>> a special implemention there hasn't been any motivation to mess
>> with it.  I'm not even that enthusiastic about colllection_size_type.
>> Turns out that each std collection has its own size_type.  So this
>> makes thing even more confusing.
>>
>> It's the way it is because there was no obvious better choice.
>>
>
> I think it is a reasonable choice.  The more control serialization gives me
> over how things are stored, the less likely it is that a change in the
> serialization library will make it impossible for me to maintain an archive
> that is binary compatible with previous versions of serialization. (In our
> case, the previous version is v1.33.1, and in this case one needs special
> handling for strings anyhow.)   For other containers, the fact that
> serialization maps the varying size_types of std collections to one type
> simplifies things.  If I don't like it, I can supply my own serialization
> routine for the container in question. In the general case (as has already
> been discussed ad nauseam), I'd argue that 'portable' has a
> context-dependent meaning (e.g. are ieee754 floats 'portable' for this use
> case?   Is little/big endianness required?) and it is up to the user to
> build an archive that implements whatever 'portable' is to them.
>
> Regarding the complaint about strings.  For our (perhaps narrow) definition
> of portable:
>
> * 32/64 bit intel platforms, linux and osx, which implies little-endian
> archives
>
> * floats stored on disk in ieee754 format
>
> * serializable types required to use stdint typedefs where types vary across
> the platforms we run on (for us this basically means 'no plain longs', but
> when/if 128 bit platforms come around, we may need to go back and change our
> 'ints' to int32_t)
>
> * binary compatible with archives from a venerable custom binary archive
> built on top of 1.33.1.
>
> We can get away with just the following in our
> portable_binary_iarchive_impl:
> template<class Archive, class Elem, class Tr>
> class portable_binary_iarchive_impl :
>  public basic_binary_iprimitive<Archive, Elem, Tr>,
>  public basic_binary_iarchive<Archive>
> {
>
> // ...
>
> void load_override(std::string& s, BOOST_PFTO int)
> {
>  uint32_t l;
>  this->load(l);
>  s.resize(l);
>  this->load_binary(&(s[0]), l);
> }
>
> void load_override(class_name_type& t, BOOST_PFTO int)
> {
>  std::string cn;
>  cn.reserve(BOOST_SERIALIZATION_MAX_KEY_SIZE);
>  this->load_override(cn, 0);
>  if(cn.size() > (BOOST_SERIALIZATION_MAX_KEY_SIZE - 1))
>    throw_exception(archive_exception(invalid_class_name));
>  std::memcpy(t, cn.data(), cn.size());
>  // borland tweak
>  t.t[cn.size()] = '\0';
> }
>
> void load_override(boost::serialization::collection_size_type& t,
>                   BOOST_PFTO int)
> {
>  uint32_t l;
>  this->load(l);
>  t = l;
> }
>
> -t
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk