Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt4] Сериализация пользовательского объекта 
:(
    Опции темы
BiTOk
Дата 8.12.2011, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 23.12.2010

Репутация: нет
Всего: нет



Доброе время суток. Потребовалось сериализовать объект на основе моего класса. Класс такого вида:

Код

class ExpertSystem
{
public:
    ExpertSystem();
    ExpertSystem(const ExpertSystem &expert_system);
    ~ExpertSystem();
...
private:
    RulesList rules_list_;
    VariableList variable_list_;
    DomainList domains_list_;
    QString name_;

    QString goal_;
};


где RulesList, VariableList, DomainList имеют такой вид:
Код

class RulesList : public QVector<Rule>
{
public:
    explicit RulesList();

    int indexOf(QString rule_name);
private:
}


Требуется упаковать объект класса ExpertSystem в файл и распаковать его из файла с минимальными затратами времени на реализацию этих действий. Сам попробовал зарегистрировать свой тип в метаобъектной системе Q_DECLARE_METATYPE(ExpertSystem), реализовать операторы << и >>, где в QDataStream просто совал rules_list_, variable_list_, domains_list_ и вызвать qRegisterMetaTypeStreamOperators для каждого из этих классов, но компилятор кричит на то, что не хватает реализации << и >> для RulesList, VariableList, DomainList. Дальше биться и пытаться реализовать это всё для каждого из озвученных классов не стал. Как лучше поступить - реализовать всё это для каждого из классов (странно, почему эти операторы не унаследовались от QVector) или есть иные, более быстрые пути для решения вопроса?
PM MAIL   Вверх
boostcoder
Дата 8.12.2011, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(BiTOk @  8.12.2011,  21:59 Найти цитируемый пост)
Как лучше поступить - реализовать всё это для каждого из классов (странно, почему эти операторы не унаследовались от QVector) или есть иные, более быстрые пути для решения вопроса?

да. использовать boost.serialization smile 
PM WWW   Вверх
bsa
Дата 8.12.2011, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(boostcoder @  8.12.2011,  23:03 Найти цитируемый пост)
да. использовать boost.serialization

Ты дурного не посоветуешь. ТС останется только реализовать сериализацию стандартных контейнеров Qt - фигня вопрос.  smile

Добавлено через 6 минут и 24 секунды
BiTOk, начну с того, что наследовался от QVector ты зря. Такие классы лучше не наследовать. Ну или хотя бы приватно. Они не предназначены для этого.
Переопредели эти методы. Получится не сильно длиннее, чем при использовании boost.serialization.

PM   Вверх
boostcoder
Дата 8.12.2011, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(bsa @  8.12.2011,  22:26 Найти цитируемый пост)
ТС останется только реализовать сериализацию стандартных контейнеров Qt - фигня вопрос.

что-то тут не так..
"стандартные контейнеры Qt" - это стёб, я полагаю? smile 
ибо какие же они стандартные, если их не может сериализовать сериализатор, сериализующий стандартные контейнеры? кто солгал?
PM WWW   Вверх
bsa
Дата 8.12.2011, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(boostcoder @  8.12.2011,  23:46 Найти цитируемый пост)
ибо какие же они стандартные, если их не может сериализовать сериализатор, сериализующий стандартные контейнеры? кто солгал?

стандартный сериализатор их сериализовать может. Он не может сериализовать наследников этих классов. Потому что не знает о них.
PM   Вверх
boostcoder
Дата 9.12.2011, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(bsa @  8.12.2011,  23:09 Найти цитируемый пост)
стандартный сериализатор их сериализовать может

boost.serialization умеет сериализовать QVector? smile 
PM WWW   Вверх
newbee
Дата 9.12.2011, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 1
Всего: 19



Такое наследование от кувектора - просто идиотизм. Определи операцию преобразования QString->Rule и будет тебе indexOf по строке, аналогично с двумя другими типами.

Если нужно быстро и сердито, а Rule и два других типа простые, держи самый джедайский метод: вытаскивай данные вектора через QVector::data() и напрямую сливай их в файл.


--------------------
You're face to face
With man who sold the world
PM   Вверх
BiTOk
Дата 9.12.2011, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 23.12.2010

Репутация: нет
Всего: нет



Цитата(newbee @ 9.12.2011,  00:27)
Такое наследование от кувектора - просто идиотизм. Определи операцию преобразования QString->Rule и будет тебе indexOf по строке, аналогично с двумя другими типами.

Если нужно быстро и сердито, а Rule и два других типа простые, держи самый джедайский метод: вытаскивай данные вектора через QVector::data() и напрямую сливай их в файл.

К сожалению, Rule и остальные классы сложные, там несколько полей, хоть и элементарных. Стало быть собрать просто так объекты не удастся, надо писать код сериализации?
PM MAIL   Вверх
bsa
Дата 9.12.2011, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(BiTOk @  9.12.2011,  08:45 Найти цитируемый пост)
К сожалению, Rule и остальные классы сложные, там несколько полей, хоть и элементарных. Стало быть собрать просто так объекты не удастся, надо писать код сериализации? 

да.
Цитата(boostcoder @  9.12.2011,  01:00 Найти цитируемый пост)
boost.serialization умеет сериализовать QVector?

надеюсь, ты тупишь только из-за недосыпа... когда речь идет о Qt, то под стандартными подразумеваются средства Qt. Естественно в Qt есть свой сериализатор, который умеет работать с контейнерами входящими в состав Qt.
PM   Вверх
boostcoder
Дата 9.12.2011, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(bsa @  9.12.2011,  09:55 Найти цитируемый пост)
под стандартными подразумеваются средства Qt

повторю. как слово "стандартный" соприкасается с куте?! smile 

зы
так и вижу ситуацию, когда bsa приходит в аптеку за аспирином, а ему говорят что стандартного аспирина нет, есть только самопальный. bsa спрашивает: "а этот самопальный, соответствует стандарту?", на что ему отвечают: "нет. он просто так же называется.". но следуя логике bsa, он его обязательно купит, и даже всем рекомендовать будет, ибо не понимает смысл слова "стандарт". страшно жить... :facepalm

Добавлено @ 10:41
Цитата(bsa @  9.12.2011,  09:55 Найти цитируемый пост)
тупишь

не исключено... но почему так долго не отпускает? smile 

Это сообщение отредактировал(а) boostcoder - 9.12.2011, 11:34
PM WWW   Вверх
newbee
Дата 9.12.2011, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 1
Всего: 19



Qt ведь совместим со стандартными (которые в std) алгоритмами и итераторами... Если сериализатор работает через них, то и кутешные вектора должен уметь сериализовать.


--------------------
You're face to face
With man who sold the world
PM   Вверх
bsa
Дата 9.12.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(boostcoder @  9.12.2011,  11:38 Найти цитируемый пост)
как слово "стандартный" соприкасается с куте?!

точно так же, как и слово "стандартный" со словом "сериализатор". 
Цитата(newbee @  9.12.2011,  15:17 Найти цитируемый пост)
Если сериализатор работает через них, то и кутешные вектора должен уметь сериализовать.
Работать то он работает, вот только необходимы соответствующие перегруженные методы, так как QVector это совсем не тоже самое, что и std::vector.

PM   Вверх
boostcoder
Дата 9.12.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(bsa @  9.12.2011,  14:35 Найти цитируемый пост)
точно так же, как и слово "стандартный" со словом "сериализатор"

а разве сериализатор стандартный? он ведь просто умеет сериализовать стандартные контейнеры smile 
PM WWW   Вверх
spyswamp
Дата 9.12.2011, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7




Модератор: Сообщение скрыто.



--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
spyswamp
Дата 11.12.2011, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



Мог бы мат просто закрыть. Лол.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0908 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.