Russian Qt Forum
Март 11, 2010, 15:51
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
(Модератор:
Sergeich
) >
Сериализация QT + BOOST
Страниц: [
1
]
2
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Сериализация QT + BOOST (Прочитано 668 раз)
paxerus
Новичок
Offline
Сообщений: 20
Сериализация QT + BOOST
«
:
Февраль 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
Новичок
Offline
Сообщений: 15
Re: Сериализация QT + BOOST
«
Ответ #1 :
Февраль 09, 2010, 08:57 »
Немножко не на вопорс, но буквально вчера проскакивала тема серилизации тут
Сериализация в Qt через использование MetaObject
. Читать рекомендуется вместе с камментами
Записан
Есть что сказать - скажи, нет - лучше бы ты промолчал...
paxerus
Новичок
Offline
Сообщений: 20
Re: Сериализация QT + BOOST
«
Ответ #2 :
Февраль 09, 2010, 15:08 »
этот метод мне не нравиться ,пробовал уже заморачиваться c QDataStream и , у Boost все красиво и просто, и главное что уже готова, просто мне не нужно скидывать дамп объекта в файл а нужно в базу его писать. можно конечно сделать по грубому запсал в файл считал из него но больно уж не красиво охото по человечески тем более что сериализация работает , а не работает только в обратную сторону
Записан
break
Программист
Offline
Сообщений: 577
Re: Сериализация QT + BOOST
«
Ответ #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
Новичок
Offline
Сообщений: 20
Re: Сериализация QT + BOOST
«
Ответ #4 :
Февраль 09, 2010, 22:16 »
Может поможет
http://habrahabr.ru/blogs/qt_software/83374/
Записан
break
Программист
Offline
Сообщений: 577
Re: Сериализация QT + BOOST
«
Ответ #5 :
Февраль 09, 2010, 22:25 »
похоже не поможет ссылку давали вторым ответом
Записан
niXman
Программист
Offline
Сообщений: 595
настоящая охота == когда ему и ей охота ;)
Re: Сериализация QT + BOOST
«
Ответ #6 :
Февраль 10, 2010, 01:42 »
paxerus
, спасибо поржал
да будет вам известно, что в бусте есть нормальный путь для сериализации.
со стандартными контейнерами все очень просто реализуется.
но для Qt, наверное геморно получится.
Записан
paxerus
Новичок
Offline
Сообщений: 20
Re: Сериализация QT + BOOST
«
Ответ #7 :
Февраль 10, 2010, 08:18 »
Цитата: niXman от Февраль 10, 2010, 01:42
paxerus
, спасибо поржал
да будет вам известно, что в бусте есть нормальный путь для сериализации.
со стандартными контейнерами все очень просто реализуется.
но для Qt, наверное геморно получится.
и что же вы смешного нашли спрашивается ,видимо вы не внимательно читали. куда уж стандартнее чем boos::serialize спрашиваеться???
Мне требуеться сохранить не стандартные QT класс а свой.
сериализация у меня готова(3 й раз переделывать из booыt обратно к QT уже не хочеться), я лишь прошу помочь сделать так чтоб мне не пришлось писать в файл, и помоч разобраться в примере,почему он не доконца работает
через boost, Qt типы я так понимаю тоже не сериализуються так как тут все наследованно и нужно тащить за собой кучу предков, а по умолчанию он вроде как ток указатели на них сохранит и все.
для моих целей (для хранения настроек системы) класса с использование STL и boost вполне достаточно, я там использую ptr_container -ы для хранения настроек,и все это красиво (еслиб еще работало до конца) сериализую
в самом крайнем случае просто забью и буду писать читать из файла, но хотелось бы более рационально
«
Последнее редактирование: Февраль 10, 2010, 08:20 от paxerus
»
Записан
break
Программист
Offline
Сообщений: 577
Re: Сериализация QT + BOOST
«
Ответ #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
Новичок
Offline
Сообщений: 20
Re: Сериализация QT + BOOST
«
Ответ #9 :
Февраль 10, 2010, 12:25 »
спасибо за разъяснения
Записан
SABROG
phpBB Супер
Offline
Сообщений: 1054
Re: Сериализация QT + BOOST
«
Ответ #10 :
Февраль 10, 2010, 20:40 »
Почему-то про Q_GADGET все забыли, не обязательно наследоваться от QObject'a.
Записан
Национальная группа
Russian Federation
на QtCentre.
Qt: 4.6.2 GCC: 4.4.0TDM
We'd get - widget!
niXman
Программист
Offline
Сообщений: 595
настоящая охота == когда ему и ей охота ;)
Re: Сериализация QT + BOOST
«
Ответ #11 :
Февраль 14, 2010, 03:40 »
Цитировать
По личному опыту скажу что работать с контейнерами Qt гораздо удобнее чем с контейнерами STL.
либо вы фанат Qt, либо никогда толком не работали с STL
замечу, что STL, потому и "Standard Template Library". а стандарт утверждают не глупцы, прошу заметить. и существует он поболее чем Qt. и очень интенсивно развивается, особенно в последнее время. и boost переходит в новый стандарт, почти полностью. поэтому, STL и boost, это наиправельнейщий подход к программированию на с++.
...ах да, быдлокодинг...как же без этого
Записан
break
Программист
Offline
Сообщений: 577
Re: Сериализация QT + BOOST
«
Ответ #12 :
Февраль 14, 2010, 17:20 »
Цитировать
подход к программированию на с++
Стандарт и удобство это разные вещи! cstring тоже стандарт но по сравнению с QString гораздо менее удобен в использовании.
При чем тут глупцы? При чем тут сколько он существует?
Цитировать
наиправельнейщий подход к программированию на с++
Что ты тогда делаешь на этом форуме - используй только STL и куски BOOST-а перешедшие в стандарт.
особенно удобство STL проявляется при описании типа итератора - до сих пор еще не утвержден тип "AUTO" который позволит не писать огромной длины строки в коде.
P.S.: А про свой быдлокодинг ты мне не рассказывай у меня с этим все в порядке.
Записан
niXman
Программист
Offline
Сообщений: 595
настоящая охота == когда ему и ей охота ;)
Re: Сериализация QT + BOOST
«
Ответ #13 :
Февраль 15, 2010, 00:07 »
break
не думаю что вы компетентны оспаривать мою позицию/мнение. вам подучиться нужно. позже возвращайтесь
особенно после этого:
Цитировать
особенно удобство STL проявляется при описании типа итератора - до сих пор еще не утвержден тип "AUTO" который позволит не писать огромной длины строки в коде.
несчастный, отсталый человечеГ
Цитировать
cstring тоже стандарт
это кто?
«
Последнее редактирование: Февраль 15, 2010, 00:30 от niXman
»
Записан
niXman
Программист
Offline
Сообщений: 595
настоящая охота == когда ему и ей охота ;)
Re: Сериализация QT + BOOST
«
Ответ #14 :
Февраль 15, 2010, 00:10 »
...
«
Последнее редактирование: Февраль 15, 2010, 06:07 от niXman
»
Записан
Страниц: [
1
]
2
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Пользовательский интерфейс (GUI)
=> Model-View-Controller (MVC)
=> Базы данных
=> Работа с сетью
=> Мультимедиа
=> 2D и 3D графика
=> Интернационализация, локализация
=> XML
=> Печать
=> Qt Script
=> ActiveX
=> Установка, сборка, отладка, тестирование
=> Qt Embedded
=> Дополнительные компоненты
=> Вклад сообщества в Qt
=> Qt-инструментарий
=> Общие вопросы
=> Уроки и статьи
=> Вопросы новичков
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
=> Архив
===> Программирование
=====> Мультимедия
=====> Python
=====> Delphi
=====> GTK
=====> Другие GUI библиотеки
===> Веб программирование
=====> PHP, PERL, CGI
=====> JavaScript
=====> WebDesign and all
Загружается...