Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июня!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Visual C++.NET
Урок 33. Сериализация класса со списком

На уроке 29 мы смотрели, как можно сериализовать собственный класс. На этом уроке мы посмотрим реализацию сериализации собственного класса на частном примере - а именно, на примере класса со списком. В списке, понятное дело, может быть достаточно много элементов и нам надо сериализовать их все, сколько бы их там не было - 1 или 123.

Наша программа будет устроена следующим образом - у нас будет класс со списком CBin, в котором будет переменная m_List типа CPtrList. В этот список m_List мы будем добавлять новые элементы - это будут указатели на класс CData. Сам класс CData будет достаточно простой - в нем будет только две переменные. В классе документа у нас будет объявлена переменная m_Bin типа CBin. Сериализация будет осуществляться так - в классе CBin мы объявим и напишем метод Serialize, который мы и будем вызывать в одноименном методе класса документа.

Создайте новый SDI-проект (все остальные параметры заготовки, предлагаемой мастером, можно оставить без изменений).

Добавьте в ваш прект класс CData для данных, хранящихся в элементах списка. Его заголовочный файл будет выглядеть так:

class CData
 
 {
 
 public:
 
     CData();
 
     virtual ~CData();
 
     //Данные класса.
 
     CString m_sData;
 
     int m_nData;
 
 };

Теперь добавьте в проект класс CBin, заголовочный файл для которого будет выглядеть так:

class CBin : public CObject
 
 {
 
 public:
 
     //Наш список.
 
     CPtrList m_List;
 
     //Функция сериализации.
 
     void Serialize(CArchive& ar);
 
     CBin();
 
     virtual ~CBin();
 
 };

В файле реализации же для класса CBin метод Serialize будет таким:

void CBin::Serialize(CArchive &ar)
 
 {
 
   int n;
 
   int nData;
 
   if (ar.IsStoring())
 
   {
 
     //Записываем количество элементов в списке.
 
     n=m_List.GetCount();
 
     ar<<n;
 
     //Берем начало списка.
 
     POSITION pos = m_List.GetHeadPosition();
 
     //Пробегаем по всему списку.
 
     while(pos!=NULL){
 
       CData *pData=(CData*)m_List.GetNext(pos);
 
       ar<<pData->m_nData;
 
       ar<<pData->m_sData;
 
     }
 
   }
 
   else{
 
     //Читаем количество элементов в списке.
 
     ar>>n;
 
     //Получаем все элементы списка.
 
     for(int i=0; i<n; i++){
 
       CData *data = new CData;
 
       ar>>data->m_nData;
 
       ar>>data->m_sData;
 
       m_List.AddTail(data);
 
     }
 
   }
 
 }

Т. е мы тут действуем так - сначала мы записываем в файл (архив) количество элементов в списке, а потом и сами элементы. Читаем же скачала число элементов, потом - сами элеметы. Так мы делаем, например, вот почему - дело в том, что в методе Serialize класса документа после сериализации нашего класса CBin мы можем сериализовать и данные из класса документа. Поэтому мы должны при чтении из архива знать, сколько данных относится к списку, а сколько - к самому документу.

Практически все мы уже сделали. Теперь класс документа. Во-первых, в нем надо объявить переменную типа CBin:

  CBin m_Bin;

И, во-вторых, добавить стандартный код для сериализации в классе документа:

void CList_serDoc::Serialize(CArchive& ar)
 
 {
 
   //Сериализация класса со списком.
 
   m_Bin.Serialize(ar);
 
   if (ar.IsStoring())
 
   {
 
     // TODO: add storing code here
 
   }
 
   else
 
   {
 
     // TODO: add loading code here
 
   }
 
 }

Все! Теперь у нас есть класс CBin со списком и этот класс можно сериализовывать.



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS