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 и специальный вид конструктора класса.