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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сериализация  (Прочитано 4570 раз)
SubaroMows
Гость
« : Сентябрь 23, 2011, 15:07 »

Возникла задача сериализовать объект определённого класс.
В этом классе мне нужно хранить объекты других классов, количество я их изначально не знаю, так как их добавляет пользователь.
Вопрос такой: Нужно сериализовать только только объект общего класса? Или + к этому нужно ещё и сериализовать объекты внутри этого объекта?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Сентябрь 23, 2011, 16:02 »

+ к этому нужно ещё и сериализовать объекты внутри этого объекта
Записан

Изучением 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
SubaroMows
Гость
« Ответ #2 : Сентябрь 23, 2011, 16:18 »

А есть способы этого избежать?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Сентябрь 23, 2011, 16:31 »

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

нужно предъявить требование к пользовательским классам реализовывать какой-то интерфейс, если это, конечно, возможно.
Записан

Изучением 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
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Сентябрь 24, 2011, 09:18 »

Ну а что мешает ввести поле типа enum {ceObject,ceObject1,ceObjct2...} classEnum;
В этом перечислении определяешь уникальные номера для типов классов.
Затем когда нужно узнать как работать с классом, получаешь его тип, и в switch-е приводишь к конкретному классу по dynamic_cast.
Это конечно далеко не лучший способ, но он работает.
Записан
brankovic
Гость
« Ответ #5 : Сентябрь 24, 2011, 09:27 »

Ну а что мешает ввести поле типа enum {ceObject,ceObject1,ceObjct2...} classEnum;
... dynamic_cast.

да что вы такое говорите страшное? Если идти путём рантайм-полиморфизма, то надо делать нормальный интерфейс типа такого:

class serializable
{
  virtual void serialize (stream &) = 0
  virtual void deserialize (stream &) = 0
}

Какой-то енум, динамик каст, зачем всё это?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #6 : Сентябрь 24, 2011, 12:11 »

Какой-то енум, динамик каст, зачем всё это?
В вашем способе от enum'а мы никуда не уйдём. Мы ж должны узнать, какой тип мы десериализуем.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Сентябрь 24, 2011, 14:04 »

Какой-то енум, динамик каст, зачем всё это?
В вашем способе от enum'а мы никуда не уйдём. Мы ж должны узнать, какой тип мы десериализуем.
Ну необязательно, напр не будем же мы делать ID для каждой string - просто полагаем что она есть. Просто практически это ID всегда есть для приличных объектов чтобы они могли записываться/читаться в любом порядке.

Очень важно писать в поток версию объекта (обычно static член). Иначе потом придется рвать волосы (на многих местах). Ну и контроль целостности данных (хотя в Ассыстенте я такого не помню).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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