Russian Qt Forum

Qt => Общие вопросы => Тема начата: RoS от Февраль 28, 2010, 15:56



Название: Запись в файл объектов
Отправлено: RoS от Февраль 28, 2010, 15:56
Здравствуйте товарищи форумчане!

Есть такой вопрос - в С++ я мог взять объект класс и записать его в двоичный файл примерно такой конструкцией - имена классические
Код:
file.write(reinterpret_cast<char*>(&myObj), sizeof(myClass));

ВОт, потом читая из файла аналогичной конструкцией read получал объект точно такой же, какой записал.
Собстно сабж - как вообще это выглядит с точки зрения Qt, чем, если это надо, необходимо заменить такую конструкцию...
И еще - можно ли записать объект, если в нем есть QString - строки же хранятся в памяти динамически, ответ нет, так? И мне следует использовать по старинке массив Символов. который отлично запишется в файл и прочтется из него? или есть другой способ?


Название: Re: Запись в файл объектов
Отправлено: lit-uriy от Февраль 28, 2010, 16:57
QDataStream


Название: Re: Запись в файл объектов
Отправлено: RoS от Февраль 28, 2010, 17:27
Я уже обращался к этому классу, не совсем понятно все же, как мне его использовать - повторю задачу:

запиать объект, содержащий текстовую информацию в файл в бинарном режиме, затем прочитать его снова в объект, а из объекта получить доступ к тексту


Название: Re: Запись в файл объектов
Отправлено: SABROG от Февраль 28, 2010, 17:46
Как раз этот класс и умеет это делать. Просто нужно примеры изучить и внимательней почитать. Ну и гугл не последний источник информации, возможно даже первый.


Название: Re: Запись в файл объектов
Отправлено: lit-uriy от Февраль 28, 2010, 17:48
>>Ну и гугл не последний источник информации, возможно даже первый.
Зачем далеко ходить, тут на форуме есть пример применения этого класса, название класса нужно использовать, как ключевое слово для поиска


Название: Re: Запись в файл объектов
Отправлено: SABROG от Февраль 28, 2010, 17:58
>>Ну и гугл не последний источник информации, возможно даже первый.
Зачем далеко ходить, тут на форуме есть пример применения этого класса, название класса нужно использовать, как ключевое слово для поиска

А там 10 примеров на 10 форумах ;)


Название: Re: Запись в файл объектов
Отправлено: Igors от Март 02, 2010, 03:28
Есть такой вопрос - в С++ я мог взять объект класс и записать его в двоичный файл примерно такой конструкцией - имена классические
Код:
file.write(reinterpret_cast<char*>(&myObj), sizeof(myClass));

ВОт, потом читая из файла аналогичной конструкцией read получал объект точно такой же, какой записал.
Это не будет работать для объектов имеющих виртуальные методы (указатель на VMT в sizeof входит и при чтении будет затерт). Поскольку в Qt практически все объекты с virtual - это не будет работать в Qt, надо использовать QDataStream и операторы >> и <<, сделано очень удобно.


Название: Re: Запись в файл объектов
Отправлено: SASA от Март 02, 2010, 11:15
Поищи по слову "cериализация". В qt нет встроеного механизма cериализации. Его надо реализовывать самому. Например, в нашем проекте объект хранинит информацию о себе в доме. Можно у него этот дом запросить, а потом создать по нему идентичный объект.


Название: Re: Запись в файл объектов
Отправлено: SABROG от Март 02, 2010, 12:47
Поищи по слову "cериализация". В qt нет встроеного механизма cериализации. Его надо реализовывать самому. Например, в нашем проекте объект хранинит информацию о себе в доме. Можно у него этот дом запросить, а потом создать по нему идентичный объект.

Почти все стандартные типы Qt сериализуются. Я недавно писал сериализатор своей структуры для QDataStream, благо в ней все типы были Qt'шными и все свелось к простой отправке почленово в стрим. И в той же последовательности, чтобы прочитать. Пишется на коленке за 5 минут.


Название: Re: Запись в файл объектов
Отправлено: SASA от Март 03, 2010, 18:39
Почти все стандартные типы Qt сериализуются.
Я говорю, что нет общего, уневерсального способа.
Цитировать
все свелось к простой отправке почленово в стрим
Для простых структур это самое правильное решение. Но есть задачи немного сложнее  :D


Название: Re: Запись в файл объектов
Отправлено: break от Март 09, 2010, 14:55
Цитировать
В qt нет встроеного механизма cериализации.
ложь, он есть и достаточно правильный

Цитировать
Я говорю, что нет общего, уневерсального способа.
любой универсальный способ не на уровне языка внесет большой оверхед т.к. прийдется наследоваться от какого-0то базового класса кот. будет уметь сохранять себя - на форуме были примеры и ссылки на наследника QObject который мог сохранять все сове проперти. Свой класс нужно было только унаследовать от этого базового класса. Но мне кажется это не лучший подход т.к. большой оверхед...

Цитировать
Для простых структур это самое правильное решение. Но есть задачи немного сложнее
Для любой сложной структуры можно переопределить операторы << и >> для работы с QDataStream, причем эти операторы будут частью этой структуры а не частью QDataStream.


Название: Re: Запись в файл объектов
Отправлено: Igors от Март 09, 2010, 15:30
... он есть и достаточно правильный
После таких выпадов дальнейшее обсуждение обычно сваливается в перетирание эмоций которые никому не интересно читать. Разве трудно было сказать то же но по-другому? И это легко исправить


Название: Re: Запись в файл объектов
Отправлено: SASA от Март 10, 2010, 14:41
ложь, он есть и достаточно правильный
Объясните в чём он состоит.
Цитировать
Для любой сложной структуры можно переопределить операторы << и >> для работы с QDataStream, причем эти операторы будут частью этой структуры а не частью QDataStream.
Это я и имел ввиду под словами "Его надо реализовывать самому". Причём это один из способов (возможно самый удобный :))