на начало
На главную страницу
Форум   

Статья :: Сериализация, или преобразование в последовательную форму


Сериализация, или преобразование в последовательную форму

Сохранение сложной структуры данных со связанными объектами может стать довольно громоздким при использовании классов File (Файл) и Stream (Поток, Абстрактный последовательный файл). Необходимо сохранить все индивидуальные поля на диске. При этом нужно помнить, какое из полей какому объекту принадлежит, и какой экземпляр класса связан с другими экземплярами объектов. При восстановлении нужно воссоздать порядок расположения полей и объектные ссылки.

Каркас .NET Framework предоставляет технологию сериализации (преобразования в последовательную форму), которая выполняет все вышесказанное самостоятельно. Сериализация преобразовывает объекты, такие как классы, структуры и массивы в поток байтов. При преобразовании из последовательной формы в параллельную поток байтов преобразовывается обратно в объекты. Сериализация и преобразование из последовательной формы в параллельную могут быть проделаны на различных машинах, если на них работает общеязыковая среда времени выполнения CLR.
Объекты могут быть преобразованы в последовательную форму без применения специально написанного кода, потому что, как мы видели, во время выполнения можно запросить метаданные объекта, что дает возможность узнать распределение памяти, занятой этим объектом. Чтобы информировать каркас, что класс может быть преобразован в последовательную форму, нужно пометить класс атрибутом System: :Serializable (Система::Преобразуемый в последовательную форму). Любое поле или свойство, которые не должны быть преобразованы в последовательную форму, могут быть отмечены атрибутом System: :NonSerialized (Система::Непреобразуемый в последовательную форму). Например, поля, которые представляют собой кэшированные переменные, не должны преобразовываться в последовательную форму. Все, что нужно сделать — пометить класс атрибутом, указывающим, что класс может быть преобразован в последовательную форму. И тогда нет необходимости в любом другом коде, выполняющем преобразование в последовательную форму.
Пример Serialization (Сериализация) показывает, как применить преобразование в последовательную форму для изучения класса HotelBroker в сборке Hotel (Гостиница). Атрибут Serializable (Преобразуемый в последовательную форму) применяется в определении класса HotelBroker. Атрибут сериализации Serializable (Преобразуемый в последовательную форму) применяется также ко всем классам, которые используются классом HotelBroker или производными от базовых классов класса HotelBroker: Broker (Брокер), Hotel (Гостиница), HotelReservation, Reservable и Reservation (Резервирование), потому что при сериализации HotelBroker должны быть также преобразованы в последовательную форму и эти классы. Если бы любой из этих классов не был отмечен атрибутом, то во время выполнения могло бы произойти исключение при попытке сериализации объекта этого типа.

[Serializable]
// [Преобразуемый в последовательную форму]
public _gc class HotelBroker:
// класс сборщика мусора HotelBroker:
public Broker,
// общедоступный Брокер
public IHotellnfo,
public IHotelAdmin,
public IHotelReservation
{
private: // частный
const int MAXDAY; // константа
const int MAXUNIT; // константа
[NonSerialized] ArrayList *cities;
// [Непреобразуемый в последовательную форму]
};
[Serializable]
// [Преобразуемый в последовательную форму]
public _gc class Hotel :
public Reservable
// класс сборщика мусора Гостиница:
Reservable
{
};
[Serializable]
// [Преобразуемый в последовательную форму]
public _gc class HotelReservation :
public Reservation
// общедоступный класс сборщика мусора HotelReservation:
Резервирование
{
} ;
[Serializable]
// [Преобразуемый в последовательную форму]
public _gc _abstract class Reservable
// сборщик мусора - абстрактный класс Reservable
{
} ;
[Serializable]
// [Преобразуемый в последовательную форму]
public _gc _abstract class Reservation
// сборщик мусора - абстрактный класс Reservation
{
} ;
[Serializable]
// [Преобразуемый в последовательную форму]
public _gc _abstract class Broker
// сборщик мусора - абстрактный класс Broker
{
};

Поле cities (города) было помечено как NonSerialized (Непреобразуемый в последовательную форму), так как название города, где размещается гостиница, сохраняется вместе с преобразованными в последовательную форму названиями гостиниц. Поэтому оно может быть восстановлено с помощью модифицированного метода AddCity. Поле cities (города) было бы пусто после преобразования класса HotelBroker из последовательной формы в параллельную, потому что оно не было сохранено.

private: // частный
void AddCity(String *city) // (Строка *city)
{
if (cities == 0) // если (города == 0)
{
cities = new ArrayList; // города
lEnumerator *pEnum = units->GetEnumerator();
while (pEnum->MoveNext() )
{
Hotel *h = // Гостиница
dynamic_cast<Hotel *>(pEnum->Current);
AddCity(h->City); // Город
}
}
// check if city already on list, add if not
// проверить, есть ли город уже в списке, добавить если нет
if (!cities->Contains(city))
// если (! города-> Содержат (город))
cities->Add(city);
// города-> Добавить (город);
}


Сериализация, или преобразование в последовательную форму

страницы в данном разделе 
Глава 8. Классы каркаса .NET Framework Классы каркаса .NET Framework
Метаданные и отражение Класс туре (Тип)
Динамическое связывание Ввод и вывод в .NЕТ
Потоковые классы Примитивные типы данных и потоки
TextReader И TextWriter Обработка файлов
Сериализация, или преобразование в последовательную форму Объекты сериализации
ISerializable Модель приложений .NET
Поток Изоляция потоков
Синхронизация коллекций Контекст
Заместители и заглушки ContextBoundObject
Изоляция приложений Прикладная область
Прикладные области и сборки Класс AppDomain (Прикладная область)
События AppDomain (Прикладная область) Пример AppDomain (Прикладная область)
Маршализация, прикладные области и контексты Асинхронное программирование
Асинхронные шаблоны проектирования lAsyncResult
Использование делегатов в асинхронном программировании Организация поточной обработки с параметрами
Удаленный доступ Краткий обзор удаленного доступа
Удаленные объекты Активация
Пример удаленного объекта Пример программы, реализующей удаленный доступ
Метаданные и удаленный доступ Конфигурационные файлы удаленного доступа
Программируемые атрибуты Использование самостоятельно созданного атрибута
Определение класса атрибута Определение базового класса
Сборка мусора Уничтожение объектов
Неуправляемые ресурсы и освобождение ранее выделенной области памяти Поколения
Завершение и раскручивание стека Управление сборкой мусора с помощью класса сборщика мусора GC
Программа-пример Резюме


Содержание сайта (выборка)
Apache
Протоколы TCP/IP (принципы, протоколы и архитектура)



PHP, PELR, JSP
PHP
JavaServer Pages (JSP)

Базы данных
Основы mysql
СУБД INFORMIX
СУБД POSTGRES
Основы проектирования реляционных баз данных

HTML, javascript
Спецификация HTML 4.01
Каскадные Таблицы Стилей, Уровень 2
Клиентский JavaScript. Справочник.
JavaScript руководство пользователя
Серверный JavaScript 1.4. Руководство по Использованию.

Паскаль, C, C++, C#
GCC (примеры)
FAQ Валентинa Озеровa DELPHI
C



 
© faq.pp.ru, справочник программиста