Листинг 11.11. Сериализация объекта

using System;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApplication1

{

[Serializable]

abstract class Spirit

{

public abstract void Passport();

}

[Serializable]

class Monster: Spirit

{

public Monster(int health, int ammo, string name)

{

this.health = health;

this.ammo = ammo; this.name = name;

}

override public void Passport()

{

Console.WriteLine("Monster {0} \t health - {1} ammo = {2}", name,

health, ammo);

}

string name;

int health, ammo;

}

[Serializable]

class Demo

{

public int a = 1;

[NonSerialized]

public double b; public Monster X, Y;

}

class Class1

{

static void Main()

{

Demo d = new Demo();

d.X = new Monster(100, 80, "Вася");

d.Y = new Monster(120, 50, "Петя");

d.a = 2;

d.b = 2;

d.X.Passport(); d.Y.Passport();

Console.WriteLine(d.a);

Console.WriteLine(d.b);

FileStream f = new FileStream("Demo.bin".FileMode.Create);

BinaryFormatter bf = new BinaryFormatter();

bf.Serialize(f, d); // сохранение объекта d в потоке f

f.Close();

}

}

}

В программе не приведены неиспользуемые методы и свойства классов. Обрати­те внимание на то, что базовые классы сохраняемых объектов также должны быть помечены как сохраняемые. Результат работы программы:

Monster Вася health = 100 ammo = 80

Monster Петя health = 120 ammo = 50

Итак, для сохранения объекта в двоичном формате необходимо:

1. Подключить к программе пространство имен System.Runtime.Serialization.
Formatters.Binary.

2. Пометить сохраняемый класс и связанные с ним классы атрибутом [Serializable].

3. Создать поток и связать его с файлом на диске или с областью оперативной
памяти.

4. Создать объект класса BinaryFormatter.

5. Сохранить объекты в потоке.

6. Закрыть файл.

В листинге 11.12 сохраненный объект считывается из файла.

Листинг 11.12. Десериализация объекта

using System;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApplication1

{

//...

class Class1

{

static void Main()

{

FileStream f = new FileStream("Demo.bin", FileMode.Open);

BinaryFormatter bf = new BinaryFormatter();

Demo d = (Demo)bf.Deserialize(f); // восстановление объекта

d.X.Passport();

d.Y.Passport();

Console.WriteLine(d.a);

Console.WriteLine(d.b);

f.Close();

}

}

}

Результат работы программы:

Monster Вася health = 100 ammo = 80

Monster Петя health = 120 ammo = 50

Как видите, при сериализации сохраняется все дерево объектов. Обратите вни­мание на то, что значение поля у не было сохранено, поскольку оно было помече­но как несохраняемое.

ПРИМЕЧАНИЕ

Сериализация в формате SOAP выполняется аналогично с помощью класса SoapFormatter. Программист может задать собственный формат сериализации, для этого ему придется реализовать в своих классах интерфейс ISerializable и специ­альный вид конструктора класса.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: