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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запись в файл объектов  (Прочитано 9749 раз)
RoS
Гость
« : Февраль 28, 2010, 15:56 »

Здравствуйте товарищи форумчане!

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

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Февраль 28, 2010, 16:57 »

QDataStream
Записан

Юра.
RoS
Гость
« Ответ #2 : Февраль 28, 2010, 17:27 »

Я уже обращался к этому классу, не совсем понятно все же, как мне его использовать - повторю задачу:

запиать объект, содержащий текстовую информацию в файл в бинарном режиме, затем прочитать его снова в объект, а из объекта получить доступ к тексту
Записан
SABROG
Гость
« Ответ #3 : Февраль 28, 2010, 17:46 »

Как раз этот класс и умеет это делать. Просто нужно примеры изучить и внимательней почитать. Ну и гугл не последний источник информации, возможно даже первый.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Февраль 28, 2010, 17:48 »

>>Ну и гугл не последний источник информации, возможно даже первый.
Зачем далеко ходить, тут на форуме есть пример применения этого класса, название класса нужно использовать, как ключевое слово для поиска
Записан

Юра.
SABROG
Гость
« Ответ #5 : Февраль 28, 2010, 17:58 »

>>Ну и гугл не последний источник информации, возможно даже первый.
Зачем далеко ходить, тут на форуме есть пример применения этого класса, название класса нужно использовать, как ключевое слово для поиска

А там 10 примеров на 10 форумах Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 02, 2010, 03:28 »

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

ВОт, потом читая из файла аналогичной конструкцией read получал объект точно такой же, какой записал.
Это не будет работать для объектов имеющих виртуальные методы (указатель на VMT в sizeof входит и при чтении будет затерт). Поскольку в Qt практически все объекты с virtual - это не будет работать в Qt, надо использовать QDataStream и операторы >> и <<, сделано очень удобно.
Записан
SASA
Гость
« Ответ #7 : Март 02, 2010, 11:15 »

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

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

Почти все стандартные типы Qt сериализуются. Я недавно писал сериализатор своей структуры для QDataStream, благо в ней все типы были Qt'шными и все свелось к простой отправке почленово в стрим. И в той же последовательности, чтобы прочитать. Пишется на коленке за 5 минут.
Записан
SASA
Гость
« Ответ #9 : Март 03, 2010, 18:39 »

Почти все стандартные типы Qt сериализуются.
Я говорю, что нет общего, уневерсального способа.
Цитировать
все свелось к простой отправке почленово в стрим
Для простых структур это самое правильное решение. Но есть задачи немного сложнее  Веселый
« Последнее редактирование: Март 03, 2010, 18:41 от SASA » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #10 : Март 09, 2010, 14:55 »

Цитировать
В qt нет встроеного механизма cериализации.
ложь, он есть и достаточно правильный

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 09, 2010, 15:30 »

... он есть и достаточно правильный
После таких выпадов дальнейшее обсуждение обычно сваливается в перетирание эмоций которые никому не интересно читать. Разве трудно было сказать то же но по-другому? И это легко исправить
Записан
SASA
Гость
« Ответ #12 : Март 10, 2010, 14:41 »

ложь, он есть и достаточно правильный
Объясните в чём он состоит.
Цитировать
Для любой сложной структуры можно переопределить операторы << и >> для работы с QDataStream, причем эти операторы будут частью этой структуры а не частью QDataStream.
Это я и имел ввиду под словами "Его надо реализовывать самому". Причём это один из способов (возможно самый удобный Улыбающийся)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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