[Development] Proposal for an efficient and robust (de)serialization mechanism working with Qt-supported data

Arnaud Clere arnaud.clere at minmaxmedical.com
Tue Aug 27 12:43:21 CEST 2019


Hi all,

Qt handles a broad spectrum of data both in and out of RAM and Qt users routinely need to read/write such data from/to their domain-specific C++ types.
But doing so can feel much more complicated than it should be: e.g. unexpected QVariant conversions, unknown QDataStream versions, complex QAbstractItemModel requirements, specific QCborStreamReader protocol, ...
Moreover, writing such boilerplate code is time-consuming, error-prone, and boring.

JSON demonstrates that having a simple data model can simplify exchanging data between software components. But it cannot meet all the technical requirements that data must meet here and there.

I am proposing to add to Qt a simple-to-use (de)serialization mechanism that can achieve better write performance and read robustness than current alternatives.
It does not define a new generic data type: QVariant/List/Map, Q*ItemModel, QJsonValue, ... are here to meet various sets of requirements.
It just defines a generic, efficient and robust templated function to 'bind' such data with any C++ type:
               QBind<T> ::bind(Value&& v, T& t)

It is not unit-tested but a sample and benchmark shows it can be made to work efficiently with:
- Qt containers (read/write)
- QMetaObject (read/write)
- QVariant* (read/write)
- QJsonValue (read/write) + ad-hoc JSON reader/writer
- QCborValue (read/write), QCborStreamReader + ad-hoc CBOR writer
- QSettings (read/write)
- QXmlStreamWriter
- QAbstractItemModel (write)
- QDataStream (write)

The simplest way to enable it for a C++ type is to use QMetaObject when available through a macro (QBIND_*_WITH_METAOBJECT).
Best performance can only be attained by defining simple bind(Value&& v) methods that usually work for both read and write:
https://gricad-gitlab.univ-grenoble-alpes.fr/modmed/modmedLog/blob/master/tests/QBind/README.md#extending-qbind-to-c-types

Finally, since a single QBind<T> function cannot fulfill all the needs, its fluent interface allows writing custom binds akin to Python list comprehensions...

I would be happy to hear if you feel like this would be a useful contribution to Qt, or to answer your technical questions and arguments.

Arnaud
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20190827/7b909503/attachment.html>


More information about the Development mailing list