C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь


http://vannbok.ru/ на что крепить панель под ванну. ; Военное дело бмп pts-beton.ru/2016/12/01/pliti-bmp/.

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

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 со списком и этот класс можно сериализовывать.