- •Тверской государственный технический университет
- •Сериализация.
- •1. Теоретическая часть.
- •1.1. Сериализация.
- •1.2. Десериализация.
- •1.3. Сериализация коллекций объектов.
- •1.3.1. Описание объекта
- •1.3.2. Роль объектных графов.
- •1.3.3. Настройка объектов для сериализации.
- •1.3.4. Главная форма приложения
- •1.3.5. Настройка фильтра диалогового окна для открытия файлов.
- •2. Указания к выполнению лабораторной работы
- •2.1. Задание на лабораторную работу
- •2.2. Содержание отчета по лабораторной работе
- •Литература:
1.3. Сериализация коллекций объектов.
1.3.1. Описание объекта
Теперь, когда известно, как сохранять единственный объект в потоке, давайте посмотрим, каким образом можно сохранить множество объектов. Как вы, возможно, заметили, метод Serialize() интерфейса IFormatter не предусматривает способа указать произвольное количество объектов в качестве ввода (допускается только один объект System.Object). Вдобавок возвращаемое значение Deserialize() также представляет собой одиночный объект System.Object (то же базовое ограничение касается и XmlSerializer):
public interface IFormatter
{
object Deserialize(Stream serializationStream);
void Serialize(Stream serializationStream, object graph);
}
Однако, если существует сериализуемый объект (помеченный атрибутом [Serializable]), который содержит в себе другие сериализуемые объекты (тоже помеченные атрибутом [Serializable]), то с помощью единственного вызова метода Serialize() будет сохраняться весь набор объектов. К счастью, большинство типов из пространств имен System.Collections и System.Collections.Generic уже помечены атрибутом [Serializable]. Таким образом, чтобы сохранить множество объектов, просто добавьте это множество в контейнер (такой как ArrayList или List<T>) и сериализуйте данный объект в выбранный поток.
Предположим, что у нас есть класс JamesBondCar, дополненный конструктором, принимающим два аргумента, для установки нескольких фрагментов данных состояния (обратите внимание, что должен быть также добавлен конструктор по умолчанию, как того требует XmlSerializer):
[Serializable]
public class Radio //Класс радиоприемника
{
public Radio(){}
public void On(bool state)
{
if (state == true) MessageBox.Show("Радио включено!");
else MessageBox.Show("Радио выключено!");
}
}
[Serializable]
public class Car // Класс обычного автомобиля
{
protected string petName;
protected int maxSpeed;
protected Radio theRadio = new Radio();
public Car()
{
petName = "Noname";
maxSpeed = 0;
}
public Car(string PetName, int maxSpeed)
{
this.petName = PetName;
this.maxSpeed = maxSpeed;
}
// Пусть значения всех переменных будут автоматически установлены по умолчанию
public string PetName
{
get { return petName; }
set { petName = value; }
}
public int MaxSpeed
{
get { return maxSpeed; }
set { maxSpeed = value; }
}
public void TurnOnRadio(bool state)
{
theRadio.On(state);
}
}
[Serializable,
//XmlRoot (Namespace = "http://www.MyCompany.com")]
public class JamesBondCar : Car // Класс специального автомобиля
{
bool canFly;
bool canSubmerge;
// XmlSerializer требует конструктора по умолчанию!
public JamesBondCar(){}
public JamesBondCar(bool skyWorthy, bool seaworthy)
{
canFly = skyWorthy;
canSubmerge = seaworthy;
}
public bool CanFly
{
set { canFly = value; }
get { return canFly; }
}
public bool CanSubmerge
{
set { canSubmerge = value; }
get { return canSubmerge; }
}
public string GetFly()
{
if (canFly) return "Может летать!";
else return "Не может летать!";
}
public string GetSubmerge()
{
if (canSubmerge) return "Может плавать под водой!";
else return "Не может плавать - тонет!";
}
}
[Serializable]
public class CarProvider
{
private List<JamesBondCar> theJBCars = new List<JamesBondCar>();
// Добавить несколько автомобилей в список.
public CarProvider(){ }
public CarProvider(bool pr)
{
if (!pr) return;
theJBCars.Add(new JamesBondCar("QMobile", 140, true, true));
theJBCars.Add(new JamesBondCar("Flyer", 150, true, false));
theJBCars.Add(new JamesBondCar("Swimmer", 160, false, true));
theJBCars.Add(new JamesBondCar("BasicJBC", 170, false, false));
}
public List<JamesBondCar> Cars
{
get { return theJBCars; }
set { Cars = value; }
}
// Получить все JamesBondCar.
public List<JamesBondCar> GetAllAutos(){ return theJBCars; }
// Получить один JamesBondCar.
public JamesBondCar GetJBCByIndex(int i){ return (JamesBondCar)theJBCars[i]; }
public void AddNewJBCar(string petName, int maxSpeed, bool canFly, bool canSubmerge)
{
theJBCars.Add(new JamesBondCar(petName, maxSpeed, canFly, canSubmerge));
}
public int GetCarNum() { return theJBCars.Count; }
public void ClearCarList() { theJBCars.Clear(); }
}
