Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Сохранение класса на диск  (Прочитано 50927 раз)
0 Пользователей и 11 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #30 : 19-09-2005 09:34 » 

Сохраняется в файл чтото левое - "яя StoredClass"

Отлично  "я - StoredClass"

ладно, шутю...
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #31 : 19-09-2005 09:39 » 

 :)Ага
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #32 : 19-09-2005 09:40 » 

if(ar.IsStoring())
 {
ar << &m_StoredClass;
 }
 else
 {
   StoredClass* pClass=&m_StoredClass;
 ar >> pClass;
 }

может тут не указателями надо ворочать?
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #33 : 19-09-2005 09:48 » 

Малая сказала что указателями да и в MSDN написано
friend CArchive& operator <<(
   CArchive& ar,
   const CObject* pOb
);
Этот оператор для указателя определен
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #34 : 19-09-2005 10:12 » 

Люди, пардон, я два дня не смотрела форум, посему не видела описания проблемы.
USBLexus,
у меня есть тестовый проект (там куча всякого мусора, но и это там тоже есть и работает) - если хочешь, я тебе его скину, посмотришь, как и что там сделано.   
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #35 : 19-09-2005 10:26 » 

USBLexus, добавь в свой класс ф-ю:

virtual void Serialize(CArchive& ar);

void StoredClass::Serialize(CArchive& ar)
{
   if (ar.IsStoring())
   {
      ar << str;
      ar << number;
      ar << rect;

   }
   else
   {
      ar >> str;
      ar >> number;
      ar >> rect;
   }
}

Это ведь объекты - полиморфизм ты используешь

 if(ar.IsStoring())
 {
ar << &m_StoredClass;
 }
 else
 {
   StoredClass* pClass=&m_StoredClass;
 ar >> pClass;
 }

 но где определён сам механизм сохранения данных в архив? Именно этим и занимается виртуальная ф-я  Serialize. Вызов которой происходит после обращения к оператору >> у каждого объекта. Те проще говоря ты сказал "Сохрани", но не сказал как?

Альтернативно можно записать вместо

 if(ar.IsStoring())
 {
ar << &m_StoredClass;
 }
 else
 {
   StoredClass* pClass=&m_StoredClass;
 ar >> pClass;
 }

просто
m_StoredClass.Serialize(ar);

Учти, что при этом получится другой формат, тк в первом случае будет сохранена инфа о классе. Те надо пользоваться или всегда первым или всегда вторым способом.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #36 : 19-09-2005 11:05 » 

Тебе просто неоходимо определить Serialize для класса StoredClass. Иначе не будет сериализовываться. Тебе уже писали об этом с самого начала Ага

Кроме этого, я еще не уверен, но по-моему здесь ты пытаешься сохранить указатель на объект.
ar << &m_StoredClass;

Чтобы сохранить объект с помощью сериализации нужно определить для него метод Serialize и вызвать его.
После того как ты опишешь функцию Serialize для класса StoredClass, то код его сохранения/чтения будет выглядеть вот так:

void CTestSaveDlg::Serialize(CArchive& ar)
{
    m_StoredClass.Serialize  (ar);
}

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

Посмотри ссылки:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cobject.3a3a.serialize.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_storing_and_loading_cobjects_via_an_archive.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_using_the_carchive_.3c3c_.and_.3e3e_.operators.asp
« Последнее редактирование: 19-09-2005 11:17 от Hooter » Записан
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #37 : 19-09-2005 11:11 » 

Малая сказала что указателями да и в MSDN написано
friend CArchive& operator <<(
 CArchive& ar,
 const CObject* pOb
);
Этот оператор для указателя определен

Этот оператор определен для указателя на CObject, а не на твой класс.
Так как эта оперция не определена для твоего класса, то указатель на твой класс по умолчанию приводится к CObject.
А operator << (CObject *)  всего лишь сохраняет значение указателя (или размер - не помню уж) и имя класса. Отсюда ты в файле видишь: яяхх StoredClass.
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #38 : 20-09-2005 01:49 » 

Люди, пардон, я два дня не смотрела форум, посему не видела описания проблемы.
USBLexus,
у меня есть тестовый проект (там куча всякого мусора, но и это там тоже есть и работает) - если хочешь, я тебе его скину, посмотришь, как и что там сделано.   


Ага хочу, скинь плиииззз))
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #39 : 20-09-2005 01:50 » 

Джон, видишь ли структура класса мне неизвестна
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #40 : 20-09-2005 06:41 » 

USBLexus,

во-первых, извини, что не сделала вчера - ребенку стало хуже, чем было, пришлось бегом к врачу бежать. А дома у меня этого проекта нет.
 
Tеперь по существу - после старта щелкаешь на кнопке "Serialize", появляется диалог для внесения и последующего просмотра элементов. Основной класс - SerialTest, класс типа твоего неизвестного - SerialPerson.
Посмотри в конструкторе диалогового класса - там задан жесткий путь к файлу, подкорректируй его для себя.
Заранее прошу прощения - там код типа "сырец" Ага, т.е. я его не полировала на предмет проверок всех возможных патовых ситуаций, т.к. это мой тестовый проект, где я что-то пробую.
Если есть вопросы - спрашивай в форуме или кинь мне маил на работу (irina.tebelewa.ext@siemens.com)
Попалась - хотела зип подвесить к ответу, а меня послали грубо и не по-женски Ага
Посему извиняюсь перед всеми.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #41 : 20-09-2005 07:06 » 

Джон, видишь ли структура класса мне неизвестна
USBLexus, ты же сам сказал, что сможешь заставить разработчика класса унаследовать класс от CObject...
Речь идет о том, чтобы разработчик класса не только унаследовал класс от CObject, но и переопределил в этом классе метод Serialize.
Если ты собираешься использовать сериализацию и сам не можешь менять реализацию этого класса, то проблема решается только так.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #42 : 20-09-2005 07:40 » 

мне кажется, если в классе выделен блок памяти через new, то не зная указателя на эту память, сохранить и восстановить её нельзя
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #43 : 20-09-2005 07:51 » 

Леш,

погоди - для работы с объектом (даже если не ты его запрограммировал) у тебя должен быть какой-то указатель на него, т.е. либо у тебя самого есть список объектов, либо тебе его кто-то создает и передает тебе указатель на него. Из чего следует, тебя интересует только его наличие (указателя то бишь) плюс, как было сказано раньше, наследование от CObject и реализация стандартного метода Serialize для того класса, объекты которого должны быть сохранены. Все.
Или ты что-то другое имеешь в виду?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #44 : 20-09-2005 08:10 » new

другое.

USBLexus в идеале хочет взять чёрный ящик и сохранить его. Если в ящике есть переменная-указатель, указывающая на выделенную new область памяти (то есть, по сути, имеем данные ВНЕ ящика и только ящик об этом знает) то идеала не получится

а заставить разработчика Serialize() написать (его написать - это отдельная песня) - это , как бы сказать, не то, что хотелось USBLexus'у изначально

вот об этом я
« Последнее редактирование: 20-12-2007 18:00 от Алексей1153++ » Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #45 : 20-09-2005 08:23 » 

Malaja
Спасибо за исходники! Посмотрел, разобрался)

Да, видимо чудес не бывает((( Знание струткуры класса необходимо((( Мда сколько придется проделать "лишней" работы по написанию функции сохранения или переопределения сериализации для каждого класса Афигеть. А если структура поменяется опять переделывать функцию сохранения а можно и забыть и будут ошибки которые можно и не найти вовремя...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #46 : 20-09-2005 08:38 » 

USBLexus,

Народ, стоп - работать с черным ящиком просто нереально! Иначе будет по классике "я у аптеки, а я в кино искала Вас "...

Т.е. каждый раз при изменении структуры надо брать разработчика за выступающие части тела и требовать продолжения банкета по правилам, т.е. теоретически в софте каждый должен сам отвечать за свой кусок кода. В данном случае это задача разработчика того самого класса - "черного ящика". Для тебай ничего не должно меняться, т.е. ты пишешь один раз свою функцию

   if(ar.IsStoring())
   {
      pObject = как-то его получаешь;
      ar << pObject;
   }
   else
   {
      // read file
      ar >> pObject;

      pObject->Set_всеПараметры(start_value);
   }

и привет.
В данном случае ты только используешь чей - то код.
Ну или тебе должен быть передан ишодный код того класса, тогда ты сам себе хозяин и тогда ты сам должен обо всем помнить Ага .
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #47 : 20-09-2005 08:42 » 

USBLexus , выход несложен - определи структуру в классе, где храни всё, что надо сохранять. В неё же встрой дополнительные функции для промежуточных всяких преобразований для сохранения / восстановления. Если что-то меняется - меняешь название встроенных функций или переменных (например приписываешь к имени функции "..._номер_версии_функции") и компилятор сам найдёт все места, на которые тебе нужно обратить внимание
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #48 : 20-09-2005 08:55 » 

Леш,

для особо тупых - как это? Я не совсем поняла, извини.  Жаль
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #49 : 20-09-2005 09:09 » 

Алексей1153,

Да я тоже об этом думал, наверное так и придется сделать. Жаль
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #50 : 20-09-2005 09:29 » 

Ирина, ты вовсе не тупая, что за глупости! Улыбаюсь

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

Если нам надо найти все связи с этой переменной - меняем её имя (к примеру с Var на Var_1) и смотрим везде, где используется.

а насчёт структуры - это очень удобно в плане, что все сохраняемые свойства в одном месте и кроме того - одним блоком памяти. Исключения - выделения памяти, с ними боремся встроенными в процедуру функциями

Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #51 : 20-09-2005 09:57 » 

Леш,

муррр Ага
Т.е. ты хочешь сказать, что если до этого в классе были переменные и функции
м_имя, м_адрес, гетИмя, гетАдрес и т.д., то теперь это должно переехать в структуру и при каждом изменении менять имена в структуре? Или я опять мимо?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #52 : 20-09-2005 10:02 » 

в принципе да - все свойства и методы над ними - в одном месте. Но менять ВСЁ каждый раз не надо. Надо переименовать только то, что меняешь ,или добавляешь. Если удаляешь - компилятор так же покажет, где зависимости были, так как переменной не стало.
А вообще - самое простое просто забить в поиск и найти все использования переменной. Но так легко запутаться.

а кроме того, отладив новую версию, имена можно вернуть на старые, если угодно. Но смысла думаю нет
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #53 : 20-09-2005 10:42 » 

Леш,

спасибо, теперь все ясно.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines