Russian Qt Forum
Ноябрь 05, 2024, 22:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Сериализация QT + BOOST  (Прочитано 11495 раз)
paxerus
Гость
« : Февраль 09, 2010, 07:54 »

Добрый день
 решил прикрутить  сериализацию в приложение QT
мне это необходимо для сохранения класса настроек приложения в БД в бинарном виде.
чтоб не мучаться решил использовать в классе только STL + BOOST
испугался что QT типы не сериализуются.
Использовал как основу данны пример
http://rsdn.ru/forum/cpp/2545626.1.aspx

serialize выполняеться хорошо,
пытаюсь селать deserialize:

Код:
template <class T>
  inline void deserialize (const std::vector<char>& buffer, T& rhs)
   {               
        try
        {
           namespace bio = boost::iostreams;
            rcontainer < std::vector<char>>  device (buffer);
        bio::stream_buffer< std::vector<char>> stream(device);
            std::istream istream (&stream);   
            boost::archive::binary_iarchive archive (istream);
            archive >>  BOOST_SERIALIZATION_NVP(rhs);
        }
        catch (std::exception& ex)
        {
            std::cerr << ex.what() << std::endl;
        }



ничего не выходит, компилируеться все нормально но после этой строчки

Код:
bio::stream_buffer< std::vector<char>> stream(device);




в stream должен быть буффер device но его там нету почему то, stream инициализируеться но в нем находить левая информация такого типа 'НННННННННННННННННННННННННННН'...

подскажите пожалуйста
Записан
sne
Гость
« Ответ #1 : Февраль 09, 2010, 08:57 »

Немножко не на вопорс, но буквально вчера проскакивала тема серилизации тут Улыбающийся Сериализация в Qt через использование MetaObject. Читать рекомендуется вместе с камментами Улыбающийся
Записан
paxerus
Гость
« Ответ #2 : Февраль 09, 2010, 15:08 »

этот метод мне не нравиться ,пробовал уже заморачиваться c QDataStream и , у Boost все красиво и просто, и главное что уже готова, просто мне не нужно скидывать дамп объекта в файл а нужно в базу его писать. можно конечно сделать по грубому запсал в файл считал из него но больно уж не красиво охото по человечески тем более что сериализация работает , а не работает только в обратную сторону
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Февраль 09, 2010, 21:28 »

Метод сериализации рассмотренный на ХАБРе имеет недостаток - надо все классы кот. требуется сериализовать наследовать от QObject - а для таких простых вещей как vector3d (маленький класс для 3D графики - это уже будет накладно). Мне кажется с QDataStream идея вернее...

Сори за оффтоп....

Цитировать
испугался что QT типы не сериализуются
Ну уж через потоки БУСТа они ведь точно не сериализуюся?

Вы конечно же обратили внимание что многие Qt классы имеют non-members для записи / чтение в QDataStream (в документации это в разделе с конкретным классом а не в разделе QDataStream)

Я могу ошибаться но мне кажется  STL + BOOST не должны требоваться как раз если нужно сохранять набор Qt классов
1) Берем QBuffer (наследник QIODevice - как раз то что нужно чтобы не писать в файл в вашем случае)
2) Создаем на базе него QDataStream
3) Все в него пишем (как упомянул выше большинство Qt классов как раз сериализуюся)
4) Сохраняем в БД в блоб поле представляя QBuffer как QByteArray (QByteArray &   buffer ())
Вроде и все
Записан
jjoss
Гость
« Ответ #4 : Февраль 09, 2010, 22:16 »

Может поможет http://habrahabr.ru/blogs/qt_software/83374/
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #5 : Февраль 09, 2010, 22:25 »

похоже не поможет ссылку давали вторым ответом
Записан
niXman
Гость
« Ответ #6 : Февраль 10, 2010, 01:42 »

paxerus, спасибо поржал Веселый
да будет вам известно, что в бусте есть нормальный путь для сериализации.
со стандартными контейнерами все очень просто реализуется.
но для Qt, наверное геморно получится.
Записан
paxerus
Гость
« Ответ #7 : Февраль 10, 2010, 08:18 »

paxerus, спасибо поржал Веселый
да будет вам известно, что в бусте есть нормальный путь для сериализации.
со стандартными контейнерами все очень просто реализуется.
но для Qt, наверное геморно получится.

и что же вы смешного нашли спрашивается ,видимо вы не внимательно читали. куда уж стандартнее чем boos::serialize спрашиваеться???

Мне требуеться сохранить не стандартные QT класс а свой.
сериализация у меня готова(3 й раз переделывать из booыt обратно к QT уже не хочеться), я лишь прошу помочь сделать так чтоб мне не пришлось писать в файл, и помоч разобраться в примере,почему он не доконца работает
через boost, Qt типы я так понимаю тоже не сериализуються так как тут все наследованно и нужно тащить за собой кучу предков, а по умолчанию он вроде как ток указатели на них сохранит и все.
для моих целей (для хранения настроек системы) класса с использование STL и boost вполне достаточно, я там использую ptr_container -ы для хранения настроек,и все это красиво (еслиб еще работало до конца) сериализую

в самом крайнем случае просто забью и буду писать читать из файла, но хотелось бы более рационально
« Последнее редактирование: Февраль 10, 2010, 08:20 от paxerus » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #8 : Февраль 10, 2010, 12:17 »

Цитировать
Qt типы я так понимаю тоже не сериализуються так как тут все наследованно и нужно тащить за собой кучу предков, а по умолчанию он вроде как ток указатели на них сохранит и все

Убила эта фраза уже после того как указали где смотреть... Qt классы сериализуются по крайней мере большинство из них. Не удивляйтесь что на форуме Qt вам предлагают все таки использовать сериализацию Qt а не Boost. По личному опыту скажу что работать с контейнерами Qt гораздо удобнее чем с контейнерами STL.

Сериализовать указатели - это вообще какой-то бред! И что я по вашему в сеть передаю указатели на экземпляры класса на другой машине?Непонимающий?

Наследование также не имеет отношения к сериализации Qt. Механизм наследования использовался по приведенной ссылке - человек хотел универсальный способ - чтобы его "НОВЫЙ" класс сериализовался не делая для этого ничего - поэтому он оттолкнулся от QObject и его Q_PROPERTY. Эта схема не является 100% удобной и не везде ее можно использовать (хотя для чего -то очень даже подойдет).

В Qt сериализация происходит создание non-memeber членов класса перекрывающие операторы << и >> для записи в QDataStream. Но для большинства классов Qt они уже перекрыты! И поэтому они СЕРИАЛИЗУЮТСЯ - достаточно почитать доку уже наконец...

Кроме того для сохранения настроек программы в БД можно еще использовать QSettings определив для него процедуры чтения/записи в БД...

И QBuffer никто не отменял...

По поводу Boost - 90% что вы где то также не дочитали документацию и не вызываете какую-нибудь ф-ю чтения после объявления потока - но это вам быстрее подскажут на форуме Boost-а вероятно а не на форуме Qt...
« Последнее редактирование: Февраль 10, 2010, 12:19 от break » Записан
paxerus
Гость
« Ответ #9 : Февраль 10, 2010, 12:25 »

спасибо за разъяснения
Записан
SABROG
Гость
« Ответ #10 : Февраль 10, 2010, 20:40 »

Почему-то про Q_GADGET все забыли, не обязательно наследоваться от QObject'a.
Записан
niXman
Гость
« Ответ #11 : Февраль 14, 2010, 03:40 »

Цитировать
По личному опыту скажу что работать с контейнерами Qt гораздо удобнее чем с контейнерами STL.
либо вы фанат Qt, либо никогда толком не работали с STL Подмигивающий

замечу, что STL, потому и "Standard Template Library". а стандарт утверждают не глупцы, прошу заметить. и существует он поболее чем Qt. и очень интенсивно развивается, особенно в последнее время. и boost переходит в новый стандарт, почти полностью. поэтому, STL и boost, это наиправельнейщий подход к программированию на с++.
...ах да, быдлокодинг...как же без этого Веселый
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #12 : Февраль 14, 2010, 17:20 »

Цитировать
подход к программированию на с++
Стандарт и удобство это разные вещи! cstring тоже стандарт но по сравнению с QString гораздо менее удобен в использовании.

При чем тут глупцы? При чем тут сколько он существует?

Цитировать
наиправельнейщий подход к программированию на с++
Что ты тогда делаешь на этом форуме - используй только STL и куски BOOST-а перешедшие в стандарт.

особенно удобство STL проявляется при описании типа итератора - до сих пор еще не утвержден тип "AUTO" который позволит не писать огромной длины строки в коде.

P.S.: А про свой быдлокодинг ты мне не рассказывай у меня с этим все в порядке.
Записан
niXman
Гость
« Ответ #13 : Февраль 15, 2010, 00:07 »

break
не думаю что вы компетентны оспаривать мою позицию/мнение. вам подучиться нужно. позже возвращайтесь Смеющийся
особенно после этого:
Цитировать
особенно удобство STL проявляется при описании типа итератора - до сих пор еще не утвержден тип "AUTO" который позволит не писать огромной длины строки в коде.
несчастный, отсталый человечеГ Смеющийся

Цитировать
cstring тоже стандарт
это кто? Шокированный
« Последнее редактирование: Февраль 15, 2010, 00:30 от niXman » Записан
niXman
Гость
« Ответ #14 : Февраль 15, 2010, 00:10 »

...
« Последнее редактирование: Февраль 15, 2010, 06:07 от niXman » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 22.