Объекты сериализации
Хотя каркас знает, как сохранять объект, помеченный атрибутом Serializable (Преобразуемый в последовательную форму), но все же необходимо определить формат, в котором будет сохранен объект, и носитель данных. Чтобы определить формат, в котором будет сохранен объект, нужно использовать экземпляр объекта, который поддерживает интерфейс IFormatter.
Каркас имеет два таких класса: System: :Runtime: :Serialization: : Formatters :: Binary: : BinaryFormatter (Система::Время выполнения:: Преобразование в последовательную форму::Форматеры::Двоичный::ВтагуРогтаиег) и System :: Runtime :: Serialization :: Formatters :: Soap :: Soар Formatter (Система :: Время выполнения :: Преобразование в последовательную форму :: Форматеры :: Sоар:: Soap-Formatter). BinaryFormatter использует двоичный, компактный формат для сериализации и преобразования из последовательной формы в параллельную на платформах, которые поддерживают общеязыковую среду времени выполнения CLR. SoapForrnatter использует промышленный стандарт протокола SOAP, который обсуждается в главе 11 "Web-службы". Так как он основан на XML, и, следовательно, является текстовым протоколом, он может использоваться для связи с платформой, не основанной на общеязыковой среде времени выполнения CLR. Двоичный формат быстрее при сериализации и преобразовании данных из последовательной формы в параллельную.
Можно, конечно, создать свои собственные классы форматирования. Это может понадобиться лишь в том случае, если при взаимодействии с внешней системой нужно учитывать ее собственный байтовый формат файловых объектов.
Пример Serialization (Сериализация) содержит код, демонстрирующий использование FileStream для сохранения и восстановления обоих форматов: двоичного и SOAP. Конечно, можно использовать любой класс, производный от Stream (Поток, Абстрактный последовательный файл), лишь бы он представлял некоторый носитель данных. Необходимо предпринять специальные меры, чтобы гарантировать, что метод Load (Загрузка) сможет изменять параметр, который указывает на HotelBroker. Для этого параметр объявляется как ссылка на указатель, указывающий на HotelBroker.
static void Save( // статический метод Сохранить
HotelBroker *broker, String *formatter)
{
FileStream *s;
if (String::Equals(formatter, "b"))
// если (Строка::Равняется (форматер, "b"))
{
s = new FileStream(
"hotels.bin", FileMode::Create); // Создать
BinaryFormatter *b = new BinaryFormatter;
b->Serialize (s, broker);
// Преобразовать в последовательную форму (s, брокер);
}
else
{
s = new FileStream(
"hotels.txt", FileMode::Create); // Создать
SoapFormatter *sf = new SoapFormatter;
sf->Serialize(s, broker);
// Преобразовать в последовательную форму (з, брокер);
}
s->Close ();
}
static void Load( // статический метод Загрузка
HotelBroker *&broker, /* ссылка на указатель */
String *formatter) // Строка
{
FileStream *s;
if (String::Equals(formatter, "b"))
// если (Строка::Равняется (форматер, "b"))
{
s = new FileStream("hotels.bin", FileMode::Open); // Открыть
BinaryFormatter *b = new BinaryFormatter; broker = // брокер
dynamic_cast<HotelBroker *>
(b->Deserialize (s) ) ;
}
else
{
s = new FileStream("hotels.txt", FileMode::Open);
// Открыть
SoapFormatter *sf = new SoapFormatter;
broker = // брокер
dynamic_cast<HotelBroker *>(sf->Deserialize(s));
}
s->Close();
ShowHotelList(broker->GetHotels());
}
Ниже приведен некоторый типовой вывод примера Serialization (Сериализация): сначала мы добавляем название гостиницы и сохраняем его с помощью форматера SOAP. Затем мы выходим из программы.
Enter command: cities
Atlanta
Boston
Commands: quit, cities, list, add, fetch, save
Enter command: list
City Name Rooms Rate
Atlanta Dixie 100 115
Atlanta Marriott 500 70
Boston Sheraton 250 95
Commands: quit, cities, list, add, fetch, save
Enter command: add
Hotel City: Philadelphia
Hotel Name: Franklin
Number Rooms: 100
Room Rate: 200
Commands: quit, cities, list, add, fetch, save
Enter command: save
Formatter: b(inary), s(oap)s
Commands: quit, cities, list, add, fetch, save
Enter command: cities
Atlanta
Boston
Philadelphia
Commands: quit, cities, list, add, fetch, save
Enter command: list
City Name Rooms Rate
Atlanta Dixie 100 115
Atlanta Harriot 500 70
Boston Sheraton 250 95
Philadelphia Franklin 100 200
Commands: quit, cities, list, add, fetch, save
Enter command: quit
Перевод такой:
Введите команду: города
Атланта
Бостон
Команды: выход, города, список, добавить, выборка, сохранить
Введите команду: список
Город Название Номера Цена
Атланта Дикси 100 115
Атланта Мэриот 500 70
Бостон Шератон 250 95
Команды: выход, города, список, добавить, выборка, сохранить
Введите команду: добавить
Город Гостиницы: Филадельфия
Название Гостиницы: Фрэнклин
Номера: 100
Цена: 200
Команды: выход, города, список, добавить, выборка, сохранить
Введите команду: сохранить
Форматер: b(inary), s(oap)s
Команды: выход, города, список, добавить, выборка, сохранить
Введите команду: города
Атланта
Бостон
Филадельфия
Команды: выход, города, список, добавить, выборка, сохранить
Введите команду: список
Город Название Номера Цена
Атланта Дикси 100 115
Атланта Мзриот 500 70
Бостон Шератон 250 95
Филадельфия Фрэнклин 100 200
Команды: выход, города, список, добавить, выборка, сохранить
Введите команду: выход
Затем выполняем программу снова и восстанавливаем данные, сохраненныепри первом запуске.
Enter command: cities
Atlanta
Boston
Commands: quit, cities, list, add, fetch, save
Enter command: list
City Name Rooms Rate
Atlanta Dixie 100 115
Atlanta Marriot 500 70
Boston Sheraton 250 95
Commands: quit, cities, list, add, fetch, save
Enter command: fetch Formatter: b(inary), s(oap)s
City Name Rooms Rate
Atlanta Dixie 100 115
Atlanta Marriot 500 70
Boston Sheraton 250 95
Philadelphia Franklin 100 200
Commands: quit, cities, list, add, fetch, save
Enter command: cities
Atlanta
Boston
Philadelphia
Пере вод такой:
Введите команду: города
Атланта
Бостон
Команды: выход, города, список, добавить, выборка, сохранить
Введите команду: список
Город Название Номера Цена
Атланта Дикси 100 115
Атланта Мэриот 500 70
Бостон Шератон 250 95
Команды: выход, города, список, добавить, выборка, сохранить
Введите команду: выборка
Форматер: b(inary), s(oap)s
Город Название Номера Цена
Атланта Дикси 100 115
Атланта Мэриот 500 70
Бостон Шератон 250 95
Филадельфия Фрэнклин 100 200
Команды: выход, города, список, добавить, выборка, сохранить
Введите команду: города
Атланта
Бостон
Филадельфия
CompEbook.ru Железо, дизайн, обучение и другие