Неинтрузивные библиотеки сериализации
От: XOOIOOX  
Дата: 09.07.18 09:26
Оценка:
Есть ли такие, которые могут, например, обрабатывать Qt-шный QString и прочее типы из сторонних либ, куда не получится встраиваться? Желательно, чтобы был на входе/выходе бинарный формат тоже, а не только XML/JSON и поддержка версий. Не хотелось бы свою криво-костыльную сериализацию велосипедить.
Re: Неинтрузивные библиотеки сериализации
От: zaufi Земля  
Дата: 09.07.18 14:12
Оценка:
Здравствуйте, XOOIOOX, Вы писали:

XOO>Есть ли такие, которые могут, например, обрабатывать Qt-шный QString и прочее типы из сторонних либ, куда не получится встраиваться? Желательно, чтобы был на входе/выходе бинарный формат тоже, а не только XML/JSON и поддержка версий. Не хотелось бы свою криво-костыльную сериализацию велосипедить.


дык boost же... чем не устраивает?
Re: Неинтрузивные библиотеки сериализации
От: vopl Россия  
Дата: 09.07.18 14:18
Оценка: +2
Здравствуйте, XOOIOOX, Вы писали:

XOO>Есть ли такие, которые могут, например, обрабатывать Qt-шный QString и прочее типы из сторонних либ, куда не получится встраиваться? Желательно, чтобы был на входе/выходе бинарный формат тоже, а не только XML/JSON и поддержка версий. Не хотелось бы свою криво-костыльную сериализацию велосипедить.


Да они вроде практически все неинтрузивно умеют.. В комплекте обычно идет поддержка набора наиболее часто используемых типов, а прикрутить свой тип — пара строк. Классика — boost.serialization. Для QString придется дописать адаптер типа такого

namespace boost { namespace serialization {
    template<class Archive>
    void save(Archive & ar, const QString & t, unsigned int version)
    {
        ar << t.toStdString();//ну а если через std::string не устроит - можно маны покурить и более эффективно сделать. Это -лишь пример.
    }
    template<class Archive>
    void load(Archive & ar, QString & t, unsigned int version)
    {
        std::string tmp;
        ar >> tmp;
        t = QString::fromStdString(tmp);
    }
}}


бинарный, xml, текстовый форматы можно. Json вроде нету из коробки.

Или вот товарищ альтернативу бусту сделал http://rsdn.org/forum/prj/4927509.1
Автор: niXman
Дата: 13.10.12
. Заявляет высокую скорость, может в бинарь, json, текст. Версионирования вроде нету. Одно время он собирался вделать поддержку Qt-шных контейнеров, но, видать, руки не дошли. Самому QString можно прикрутить по примерно такой же схеме что и для буста.

Смотри их сколько здесь, выбирай на вкус
Re[2]: Неинтрузивные библиотеки сериализации
От: XOOIOOX  
Дата: 09.07.18 15:33
Оценка:
Здравствуйте, vopl, Вы писали:

V>Для QString придется дописать адаптер типа такого


Вон оно что. Спасибо!
Re: Неинтрузивные библиотеки сериализации
От: Zhendos  
Дата: 09.07.18 20:43
Оценка: +2
Здравствуйте, XOOIOOX, Вы писали:

XOO>Есть ли такие, которые могут, например, обрабатывать Qt-шный QString и прочее типы из сторонних либ, куда не получится встраиваться? Желательно, чтобы был на входе/выходе бинарный формат тоже, а не только XML/JSON и поддержка версий. Не хотелось бы свою криво-костыльную сериализацию велосипедить.


Qt кстати тоже имеет расширяемый бинарный сериализатор,
просто нужно определить operator<< для QDataStream.
Re[2]: Неинтрузивные библиотеки сериализации
От: XOOIOOX  
Дата: 09.07.18 22:58
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>дык boost же... чем не устраивает?


Душный он какой-то в этом плане. Под ICC бинари компилить отдельно надо. Ну его.
Re[2]: Неинтрузивные библиотеки сериализации
От: XOOIOOX  
Дата: 09.07.18 23:08
Оценка:
Здравствуйте, vopl, Вы писали:

V>Смотри их сколько здесь, выбирай на вкус


В итоге остановился на Каше. Вроде нормально заходит:

#include <sstream>
#include <cereal/archives/binary.hpp>
#include <cereal/types/string.hpp>

struct A { QString str; };
struct B { int digit; };
struct C { A a; B b; };

namespace cereal
{
    template<class Archive> void save(Archive& archive, A const& m) { archive(m.str); }
    template<class Archive> void load(Archive& archive, A& m) { archive(m.str); }
    template<class Archive> void save(Archive& archive, B const& m) { archive(m.digit); }
    template<class Archive> void load(Archive& archive, B& m) { archive(m.digit); }
    template<class Archive> void save(Archive& archive, C const& m) { archive(m.a, m.b); }
    template<class Archive> void load(Archive& archive, C& m) { archive(m.a, m.b); }

    template<class Archive>
    void save(Archive& archive, QString const& m)
    {
        archive(m.toStdString());
    }

    template<class Archive>
    void load(Archive& archive, QString& m)
    {
        std::string tmp;
        archive(tmp);
        m = QString::fromStdString(tmp);
    }
}

int main(int argc, char *argv[])
{
    C cOut = { { "foooo" }, { 42 } };
    C cIn;
    std::stringstream stream;

    {
        cereal::BinaryOutputArchive oarchive(stream);        // save
        oarchive(cOut);
    }

    {
        cereal::BinaryInputArchive iarchive(stream);        // load
        iarchive(cIn);
    }
}
Re[3]: Неинтрузивные библиотеки сериализации
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 13.07.18 12:39
Оценка: +1
Здравствуйте, XOOIOOX, Вы писали:

XOO>В итоге остановился на Каше. Вроде нормально заходит:

А чего никсановский YAS не взял?
Sic luceat lux!
Re[4]: Неинтрузивные библиотеки сериализации
От: XOOIOOX  
Дата: 13.07.18 15:24
Оценка:
Здравствуйте, Kernan, Вы писали:

K>А чего никсановский YAS не взял?


Мануала нема. Версионирование отсутствует. Не понятно, есть ли раздельные save/load.
Re[5]: Неинтрузивные библиотеки сериализации
От: flаt  
Дата: 16.07.18 08:06
Оценка:
Здравствуйте, XOOIOOX, Вы писали:


K>>А чего никсановский YAS не взял?


XOO>Мануала нема. Версионирование отсутствует. Не понятно, есть ли раздельные save/load.


Опенсурс
Re[6]: Неинтрузивные библиотеки сериализации
От: XOOIOOX  
Дата: 16.07.18 12:22
Оценка:
Здравствуйте, flаt, Вы писали:

F>Опенсурс


Штош, юникс вэй.
Re[5]: Неинтрузивные библиотеки сериализации
От: _NN_ www.nemerleweb.com
Дата: 17.07.18 12:27
Оценка:
Здравствуйте, XOOIOOX, Вы писали:

K>>А чего никсановский YAS не взял?


XOO>Мануала нема. Версионирование отсутствует. Не понятно, есть ли раздельные save/load.


niXman тут на форуме крутится, можно все вопросы прямо тут и задать.
http://www.rsdn.org/forum/prj/4927509.1
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.