Boost logo

Boost :

From: Bjorn Reese (breese_at_[hidden])
Date: 2019-12-09 14:30:19


On 2019-12-08 16:48, Vinnie Falco wrote:

> Consider a simple struct with members a, b, and c. We might archive it this way:
>
> a & BOOST_SERIALIZATION_NVP("a", a);
> b & BOOST_SERIALIZATION_NVP("b", b);
> c & BOOST_SERIALIZATION_NVP("c", c);
>
> The resulting JSON might look like this:
>
> { "a" : 1, "b" : 2, "c" : 3 }

You are specifying the order of the entries in the serialization code,
so I would expect this to be serialized into a JSON Array:

     [ ["a", 1], ["b", 2], ["c", 3] ]

However, I acknowledge your point about reading "tagged" data from
a JSON Object. This is fairly easy to do, but does involve a bit of
boilerplate because the current serialization wrappers assume that
classes are encoded as JSON Array, so we need to use non-intrusive
serialization in order to by-pass this default behaviour.

Assuming we have a "struct alphabet" with the a, b, c variables, then
the following wrapper will read the variables in any user-modified
order. No changes to the any of the APIs are needed:

namespace trial { namespace protocol { namespace serialization {
template <typename CharT>
struct load_overloader<json::basic_iarchive<CharT>, alphabet>
{
     static void load(json::basic_iarchive<CharT>& archive,
                      alphabet& data,
                      const unsigned int protocol_version)
     {
         archive.template load<json::token::begin_object>();
         while (!archive.template at<json::token::end_object>())
         {
             std::string key;
             archive.load_override(key, protocol_version);
             if (key == "a")
             {
                 archive.load_override(data.a, protocol_version);
             }
             else if (key == "b")
             {
                 archive.load_override(data.b, protocol_version);
             }
             else if (key == "c")
             {
                 archive.load_override(data.c, protocol_version);
             }
             else
             {
                 throw json::error(json::invalid_key);
             }
         }
         archive.template load<json::token::end_object>();
     }
};
}}}

> I was referring to stackless coroutines. That type of coroutine still
> has stack variables. It just doesn't save the entire stack at a
> suspend point. The compiler can turn any function which has statically
> bounded stack requirements into a "stackless coroutine."

Do you have a reference to how these stackless-with-bounded-stack
coroutines works?


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