Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лр4_сериализация.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
306 Кб
Скачать
☆

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(); }

}