| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [qt4] Сериализация пользовательского объекта |
| Автор: BiTOk 8.12.2011, 21:59 | ||||
Доброе время суток. Потребовалось сериализовать объект на основе моего класса. Класс такого вида:
где RulesList, VariableList, DomainList имеют такой вид:
Требуется упаковать объект класса ExpertSystem в файл и распаковать его из файла с минимальными затратами времени на реализацию этих действий. Сам попробовал зарегистрировать свой тип в метаобъектной системе Q_DECLARE_METATYPE(ExpertSystem), реализовать операторы << и >>, где в QDataStream просто совал rules_list_, variable_list_, domains_list_ и вызвать qRegisterMetaTypeStreamOperators для каждого из этих классов, но компилятор кричит на то, что не хватает реализации << и >> для RulesList, VariableList, DomainList. Дальше биться и пытаться реализовать это всё для каждого из озвученных классов не стал. Как лучше поступить - реализовать всё это для каждого из классов (странно, почему эти операторы не унаследовались от QVector) или есть иные, более быстрые пути для решения вопроса? |
| Автор: bsa 8.12.2011, 22:26 |
Ты дурного не посоветуешь. ТС останется только реализовать сериализацию стандартных контейнеров Qt - фигня вопрос. Добавлено через 6 минут и 24 секунды BiTOk, начну с того, что наследовался от QVector ты зря. Такие классы лучше не наследовать. Ну или хотя бы приватно. Они не предназначены для этого. Переопредели эти методы. Получится не сильно длиннее, чем при использовании boost.serialization. |
| Автор: boostcoder 8.12.2011, 22:46 | ||
что-то тут не так.. "стандартные контейнеры Qt" - это стёб, я полагаю? ибо какие же они стандартные, если их не может сериализовать сериализатор, сериализующий стандартные контейнеры? кто солгал? |
| Автор: bsa 8.12.2011, 23:09 | ||
стандартный сериализатор их сериализовать может. Он не может сериализовать наследников этих классов. Потому что не знает о них. |
| Автор: boostcoder 9.12.2011, 00:00 |
boost.serialization умеет сериализовать QVector? |
| Автор: newbee 9.12.2011, 00:27 |
| Такое наследование от кувектора - просто идиотизм. Определи операцию преобразования QString->Rule и будет тебе indexOf по строке, аналогично с двумя другими типами. Если нужно быстро и сердито, а Rule и два других типа простые, держи самый джедайский метод: вытаскивай данные вектора через QVector::data() и напрямую сливай их в файл. |
| Автор: BiTOk 9.12.2011, 07:45 | ||
К сожалению, Rule и остальные классы сложные, там несколько полей, хоть и элементарных. Стало быть собрать просто так объекты не удастся, надо писать код сериализации? |
| Автор: bsa 9.12.2011, 09:55 | ||
да. надеюсь, ты тупишь только из-за недосыпа... когда речь идет о Qt, то под стандартными подразумеваются средства Qt. Естественно в Qt есть свой сериализатор, который умеет работать с контейнерами входящими в состав Qt. |
| Автор: boostcoder 9.12.2011, 10:38 |
повторю. как слово "стандартный" соприкасается с куте?! зы так и вижу ситуацию, когда bsa приходит в аптеку за аспирином, а ему говорят что стандартного аспирина нет, есть только самопальный. bsa спрашивает: "а этот самопальный, соответствует стандарту?", на что ему отвечают: "нет. он просто так же называется.". но следуя логике bsa, он его обязательно купит, и даже всем рекомендовать будет, ибо не понимает смысл слова "стандарт". страшно жить... :facepalm Добавлено @ 10:41 не исключено... но почему так долго не отпускает? |
| Автор: newbee 9.12.2011, 14:17 |
| Qt ведь совместим со стандартными (которые в std) алгоритмами и итераторами... Если сериализатор работает через них, то и кутешные вектора должен уметь сериализовать. |
| Автор: bsa 9.12.2011, 14:35 | ||
точно так же, как и слово "стандартный" со словом "сериализатор".
|
| Автор: boostcoder 9.12.2011, 14:47 |
а разве сериализатор стандартный? он ведь просто умеет сериализовать стандартные контейнеры |
| Автор: spyswamp 9.12.2011, 17:56 |
Модератор: Сообщение скрыто. |
| Автор: spyswamp 11.12.2011, 21:52 |
| Мог бы мат просто закрыть. Лол. |
| Автор: Artemon 13.12.2011, 09:51 | ||||
| Вот пример класса, который можно записать в файл, передать по сети и т.д. Если поля класса - тоже сложные объекты, то с ними можно поступить точно также. Базовый класс:
Производный класс
При таком подходе можешь проводить сериализацию полиморфных классов. |