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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Сериализация объектов  (Прочитано 23948 раз)
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #15 : Июнь 14, 2011, 17:02 »


я не буду для сериализации вектора использовать <<. я сериализую каждый объект отдельно, а полученный массив добавляю в поток.

в целом-то подход правильный?

Я бы сказал:"Работать будет, но..."
Записан
deaks
Гость
« Ответ #16 : Июнь 14, 2011, 17:06 »

Цитировать
P.S. может попробуй описать задачу поподробней (какие обьекты, от чего наследуются, как хранятся).

Mожет boost::serialization? (http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/index.html)

нет, буст мне тут не нужен.

передаваемые объекты имеют простую структуру. каждый имеет около десятка полей простых типов

PSSS

что-то не пойму, выполняю следующий код -
Код
C++ (Qt)
QByteArray ba;
       int count = 0;
QDataStream ds(&ba, QIODevice::WriteOnly);
 
ds << count;
 

так при этом у ba изменяется только поле size = 4, а поле data=""
« Последнее редактирование: Июнь 14, 2011, 17:11 от deaks » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #17 : Июнь 14, 2011, 17:12 »

Поэтому первое что мне бросилось в глаза - автор статьи не пишет число properties в поток - ну наверное у него ничего меняться не будет  Улыбающийся

Автор получает количество свойств через
Код
C++ (Qt)
this->metaObject()->propertyCount()
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #18 : Июнь 14, 2011, 17:16 »

так при этом у ba изменяется только поле size = 4, а поле data=""

Потому что поле data() имеет тип char*, т.е. сторка с завершающим нулем, а у тебя все 4 байта нули.
Записан
deaks
Гость
« Ответ #19 : Июнь 14, 2011, 17:30 »

хмм, ну так-то да, но все равно, какое бы число я не передал в поток ba в поле data ничего не меняется

или это просто отладчик студии не хочет показывать?))
« Последнее редактирование: Июнь 14, 2011, 17:36 от deaks » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #20 : Июнь 14, 2011, 17:39 »

Код
C++ (Qt)
 
QString res;
for(int i = 0;i<ba.size();++i)
{
res.append(QString("%1").arg(static_cast<int>(data[i]),2,16,QChar('0')));
if(i<(data.size()-1))
{
res.append(' ');
}
}
qDebug()<<res;
 

Для отладки используй QtCreator2.2 (или старше Подмигивающий  )
И для кодинга тоже.
« Последнее редактирование: Июнь 14, 2011, 18:01 от alex312 » Записан
deaks
Гость
« Ответ #21 : Июнь 14, 2011, 17:51 »

хмм, и в самом деле отладчик студии не показывал...странно
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Июнь 14, 2011, 18:50 »

Автор получает количество свойств через
Код
C++ (Qt)
this->metaObject()->propertyCount()
А откуда уверенность что именно такое число пропердей сохранено в потоке? И именно таких что понимаются читающим? Никакой совместимостью здесь не пахнет
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #23 : Июнь 14, 2011, 19:12 »

А откуда уверенность что именно такое число пропердей сохранено в потоке? И именно таких что понимаются читающим? Никакой совместимостью здесь не пахнет
Ну есть небольшая надежда на то что вы серализуете QMySeriazableClass, а потом его и восстанавливаете. Вопрос, как определить что это именно QMySeriazableClass, а не QInheritedMySeriazableClassPlus2Prop в статье не рассмотрен, его надо решать. Надо как-то сохранять информацию о типе, а затем при чтении создавать обьекты нужного типа. посмотрите ссылку, которую я давал раньше http://cartan.cas.suffolk.edu/oopdocbook/opensource/exportcode.html
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Июнь 15, 2011, 15:38 »

Надо как-то сохранять информацию о типе, а затем при чтении создавать обьекты нужного типа. посмотрите ссылку, которую я давал раньше http://cartan.cas.suffolk.edu/oopdocbook/opensource/exportcode.html
Ну рекурсивно сохранили все дерево, с экспорта (пишущего) много не возьмешь, он пишет что у него есть. А вот с читающим - др. дело. Хотелось бы чтобы он сам создавал объекты из потока, не заставляя меня разбираться с оbjectName и.т.п. Хотя возможно я слишком много хочу и оптимальный подход - крутить самому используя механизм properties (если я правильно понял их надо выгружать/загружать в рабочие данные).
Записан
deaks
Гость
« Ответ #25 : Июнь 15, 2011, 15:51 »

Код
C++ (Qt)
 
QString res;
for(int i = 0;i<ba.size();++i)
{
res.append(QString("%1").arg(static_cast<int>(data[i]),2,16,QChar('0')));
if(i<(data.size()-1))
{
res.append(' ');
}
}
qDebug()<<res;
 

Для отладки используй QtCreator2.2 (или старше Подмигивающий  )
И для кодинга тоже.

выполнил все так. res содержит данные.
хочу скопировать данные массива в строку(char *):
Код
C++ (Qt)
strcpy(outData, ba.constData());
 
но в результате пустая строка. видимо я чего-то не понимаю
« Последнее редактирование: Июнь 15, 2011, 15:52 от deaks » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #26 : Июнь 15, 2011, 16:19 »

так если данные находятся в res, зачем копируешь из ba?
Код
C++ (Qt)
strcpy(outData, res.toLatin1().constData());
или я тоже чего-то не понимаю? Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #27 : Июнь 15, 2011, 18:10 »

to deaks Блин, у тебя же бинарные данные, вот обьясни, ну навига тебе этот допотопный char*  Непонимающий

to kambala Даные таки находятся в ba, а res  - так для отладки перевод бинарных данных в строковое представление (для отладки).
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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