Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

КОП-Примеры / Сериализация

.doc
Скачиваний:
14
Добавлен:
12.03.2015
Размер:
108.03 Кб
Скачать

Пример 9.1. Использование форматизаторов.

///////////////

// C#

// Подключить Project/AddReference System.Runtime.Serialization...

using System;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Soap;

using System.Runtime.Serialization.Formatters.Binary;

// Класс сериализуемого объекта

[Serializable]

class Serial

{ private string name;

public Serial (string N ) {name= N;}

// Свойство Name

public string Name {get {return name;}}

}

class App

{ static void Main ( )

{ // Сериализация и десериализация объекта

// BinaryFormatter форматизатором

SerializeBinary ( );

DeserializeBinary ( );

// Сериализация и десериализация объекта

// SoapFormatter форматизатором

SerializeSoap ( );

DeserializeSoap ( );

}

// Сериализовать двоичным форматизатором

static void SerializeBinary()

{ // Создать сериализуемый объект ser

Serial ser= new Serial ("name");

// Создать файл для сохранения сериализуемого объекта

FileStream fs = new FileStream ("DataFile.out", FileMode.Create);

// Создать двоичный форматизатор

BinaryFormatter formatter = new BinaryFormatter ( );

// Сериализировать объект ser

formatter.Serialize (fs, ser);

// Закрыть файл

fs.Close ( );

}

// Десериализовать двоичным форматизатором

static void DeserializeBinary ( )

{ // Создать ссылку на сериализованный объект ser

Serial ser = null;

// Открыть файл с сериализованным объектом

FileStream fs = new FileStream ("DataFile.out", FileMode.Open);

// Создать двоичный форматизатор

BinaryFormatter formatter = new BinaryFormatter ( );

// Десериализовать объект ser

ser = (Serial) formatter.Deserialize (fs);

// Убедиться, что данные объекта сохранились

Console.WriteLine ("ser.Name= " + ser.Name);

// Закрыть файл

fs.Close ( );

}

// Сериализовать SOAP форматизатором

static void SerializeSoap()

{ // Создать сериализуемый объект ser

Serial ser= new Serial ("имя");

// Создать файл для сохранения сериализуемого объекта

FileStream fs = new FileStream ("DataFile.out", FileMode.Create);

// Создать двоичный форматизатор

SoapFormatter formatter = new SoapFormatter ( );

// Сериализировать объект ser

formatter.Serialize (fs, ser);

// Закрыть файл

fs.Close ( );

}

// Десериализовать SOAP форматизатором

static void DeserializeSoap ( )

{ // Создать ссылку на сериализованный объект

Serial ser = null;

// Открыть файл с сериализованным объектом

FileStream fs = new FileStream ("DataFile.out", FileMode.Open);

// Создать двоичный форматизатор

SoapFormatter formatter = new SoapFormatter ( );

// Десериализовать объект

ser = (Serial) formatter.Deserialize (fs);

// Убедиться, что данные объекта сохранились

Console.WriteLine ("ser.Name= " + ser.Name);

// Закрыть файл

fs.Close ( );

}

}

Пример 9.2. Сериализация объекта с событием.

///////////////

// C#

// Подключить Project/AddReference System.Runtime.Serialization...

using System;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

delegate void DelEv (string s);

// Класс сериализуемого объекта

[Serializable]

class Serial

{ private string name;

[field:NonSerialized]

public event DelEv ev;

public Serial (string N ) {name= N;}

// Свойство Name

public string Name {get {return name;}}

// Генерировать событие

public void GenEv (string s)

{if (ev != null) ev (s);}

}

class App

{ static void Main()

{ // Сериализация и десериализация объекта

// BinaryFormatter форматизатором

SerializeBinary ( );

DeserializeBinary ( );

}

// Сериализовать двоичным форматизатором

static void SerializeBinary()

{ // Создать сериализуемый объект

Serial ser= new Serial ("name");

// Подписать обработчик на событие объекта до его сериализации

ser.ev += new DelEv (App.EvHandler);

// Сгенерировать событие объекта до его сериализации

ser.GenEv ("Привет");

// Создать файл для сохранения сериализуемого объекта

FileStream fs = new FileStream ("DataFile.out", FileMode.Create);

// Создать двоичный форматизатор

BinaryFormatter formatter = new BinaryFormatter ( );

// Сериализировать объект ser

formatter.Serialize (fs, ser);

// Закрыть файл

fs.Close ( );

}

// Десериализовать двоичным форматизатором

static void DeserializeBinary ( )

{ // Создать ссылку на сериализованный объект

Serial ser = null;

// Открыть файл с сериализованным объектом

FileStream fs = new FileStream ("DataFile.out", FileMode.Open);

// Создать двоичный форматизатор

BinaryFormatter formatter = new BinaryFormatter ( );

// Десериализовать объект

ser = (Serial) formatter.Deserialize (fs);

// Подписать обработчик на событие объекта после его

// десериализации

ser.ev += new DelEv (App.EvHandler);

// Сгенерировать событие объекта после его десериализации

ser.GenEv ("Ещё привет");

// Убедиться, что данные объекта сохранились

Console.WriteLine ("ser.Name= " + ser.Name);

// Закрыть файл

fs.Close ( );

}

// Обработчик события

static void EvHandler (string s)

{

Console.WriteLine ("Получено сообщение:" + s);

}

}

Пример 9.3. Сериализация источника и приёмника события.

///////////////

// C#

// Подключить Project/AddReference System.Runtime.Serialization...

using System;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

delegate void DelEv (string s);

// Класс сериализуемого объекта - источника события

[Serializable]

class Serial

{ private string name;

[field:NonSerialized]

public event DelEv ev;

public Serial (string N ) {name= N;}

// Свойство Name

public string Name {get {return name;}}

public void GenEv (string s)

{

if (ev != null) ev (s);

}

}

// Класс сериализуемого объекта - приёмника события

[Serializable]

class User

{ // Обработчик события

public void EvHandler (string s)

{Console.WriteLine ("Получено сообщение:" + s);}

}

class App

{ static void Main ( )

{ // Сериализация и десериализация объектов

// BinaryFormatter форматизатором

SerializeBinary ( );

DeserializeBinary ( );

}

// Сериализовать двоичным форматизатором

static void SerializeBinary()

{ // Создать сериализуемыe объекты

Serial ser= new Serial ("name");

User user= new User ( );

// Подписать обработчик на событие объекта до его сериализации

ser.ev += new DelEv (user.EvHandler);

// Сгенерировать событие объекта до его сериализации

ser.GenEv ("Привет");

// Создать файл для сохранения сериализуемого объекта

FileStream fs = new FileStream ("DataFile.out", FileMode.Create);

// Создать двоичный форматизатор

BinaryFormatter formatter = new BinaryFormatter ( );

// Сериализировать объекты

formatter.Serialize (fs, ser);

formatter.Serialize (fs, user);

// Закрыть файл

fs.Close ( );

}

// Десериализовать двоичным форматизатором

static void DeserializeBinary ( )

{ // Создать ссылки на сериализованные объекты

User user= null;

Serial ser= null;

// Открыть файл с сериализованными объектами

FileStream fs = new FileStream ("DataFile.out", FileMode.Open);

// Создать двоичный форматизатор

BinaryFormatter formatter = new BinaryFormatter ( );

// Десериализовать объекты

ser = (Serial) formatter.Deserialize (fs);

user = (User) formatter.Deserialize (fs);

// Подписать обработчик на событие объекта

// после десериализации объектов

ser.ev += new DelEv (user.EvHandler);

// Сгенерировать событие объекта после его десериализации

ser.GenEv ("Ещё привет");

// Убедиться, что данные объекта сохранились

Console.WriteLine ("ser.Name= " + ser.Name);

// Закрыть файл

fs.Close ( );

}

}

Пример 9.4. Сериализация источника и приёмника-источника события.

///////////////

// C#

// Подключить Project/AddReference System.Runtime.Serialization...

// Каждый цикл потоковой функции серелизуемог объекта генерирует

// событие, которое отправляется обработчику User,

// который в свою очередь генерирует событие,

// которое отправляется обработчику в серелизуемый объект.

using System;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

using System.Threading;

public delegate void DelEv (int n);

// Класс сериализуемого объекта – приёмника и источника события

[Serializable]

class User

{ [field:NonSerialized]

public event DelEv ev;

public void EvHandler (int n)

{if (ev != null) ev (n); }

}

// Класс сериализуемого объекта

[Serializable]

class SerialThr

{ private string name;

private bool life;

private bool run;

private int n= 0;

[field:NonSerialized]

public DelEv ev;

[field:NonSerialized]

Thread thr;

public SerialThr (string N )

{ name= N;

run= false;

}

// Свойство Name

public string Name {get {return name;}}

public bool Life {get {return life;}}

public bool Run {get {return run;}}

public int N {get {return n;}}

public void Start ( )

{ run= true;

life= true;

thr= new Thread (new ThreadStart (this.ThrFunc));

thr.Start ( );

}

public void Finish ( )

{ run= false;

life= false;

thr.Join ( );

}

private void ThrFunc ( )

{ while (life)

{ n++;

if (ev != null) ev (n);

Thread.Sleep (30);

}

}

public void EvHandler (int n)

{Console.WriteLine("n= " + n);}

}

class App

{ static void Main()

{ User user= new User ( );///

// Создать сериализуемый объект и стартовать поток

SerialThr ser= new SerialThr ("name");

// Подписаться на события

ser.ev += new DelEv (user.EvHandler);///

user.ev += new DelEv (ser.EvHandler);///

ser.Start ( );

Thread.Sleep (100);

Console.WriteLine ("ser.Name= " + ser.Name + " ser.Run= " +

ser.Run + " ser.Life= " + ser.Life + " ser.N= " + ser.N );

// Создать файл для сохранения сериализуемого объекта

FileStream fs = new FileStream ("DataFile.out", FileMode.Create);

// Создать двоичный форматизатор

BinaryFormatter formatter = new BinaryFormatter ( );

// Сериализировать объект ser и объект user

formatter.Serialize (fs, ser);

formatter.Serialize (fs, user);///

// Закрыть файл

fs.Close ( );

// Создать ссылку на сериализованный объект

SerialThr ser1 = null;

User user1 = null;///

// Открыть файл с сериализованным объектом

FileStream fs1 = new FileStream ("DataFile.out", FileMode.Open);

// Создать двоичный форматизатор

BinaryFormatter formatter1 = new BinaryFormatter ( );

// Десериализовать объекты

ser1 = (SerialThr) formatter.Deserialize (fs1);

user1 = (User) formatter.Deserialize (fs1);

// Подписаться на события

ser1.ev += new DelEv (user1.EvHandler);///

user1.ev += new DelEv (ser1.EvHandler);///

// Закрыть файл

fs1.Close ( );

Console.WriteLine ("ser1.Name= " + ser1.Name + " ser1.Run= " +

ser1.Run + " ser1.Life= " + ser1.Life + " ser1.N= " + ser1.N );

// Стартовать поток десериализуемого объекта

ser1.Start ( );

Thread.Sleep (50);

// Завершить выполнение потоков двух объектов

ser1.Finish ( );

ser.Finish ( );

}

}

Пример 9.5. Сериализация объекта с потоком.

///////////////

// C#

// Подключить Project/AddReference System.Runtime.Serialization...

using System;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

using System.Threading;

// Класс сериализуемого объекта

[Serializable]

class SerialThr

{ private string name;

private bool life;

private bool run;

private int n= 0;

[field:NonSerialized]

Thread thr;

public SerialThr (string N )

{ name= N;

run= false;

}

// Свойство Name

public string Name {get {return name;}}

public bool Life {get {return life;}}

public bool Run {get {return run;}}

public int N {get {return n;}}

public void Start ( )

{ run= true;

life= true;

thr= new Thread (new ThreadStart (this.ThrFunc));

thr.Start ( );

}

public void Finish ( )

{ run= false;

life= false;

thr.Join ( );

}

public void Suspend ( )

{ if (run)

{ run= false;

thr.Suspend ( );

}

}

public void Resume ( )

{ if (!run)

{ run= true;

thr.Resume ( );

}

}

private void ThrFunc ( )

{ while (life)

{ n++;

Console.WriteLine ("n= " + n);

Thread.Sleep (30);

}

}

}

class App

{

static void Main ( )

{ // Сериализация объекта

SerializeBinary ( );

// Десериализация объекта

DeserializeBinary ( );

}

// Сериализовать двоичным форматизатором

static void SerializeBinary ( )

{ // Создать сериализуемый объект

SerialThr ser= new SerialThr ("name");

ser.Start ( );

Thread.Sleep (100);

ser.Suspend ( );

Console.WriteLine ("ser.Run= " + ser.Run

+ " ser.Life= " + ser.Life + " ser.N= " + ser.N );

//ser.Finish ( );

// Создать файл для сохранения сериализуемого объекта

FileStream fs = new FileStream ("DataFile.out", FileMode.Create);

// Создать двоичный форматизатор

BinaryFormatter formatter = new BinaryFormatter ( );

// Сериализировать объект ser

formatter.Serialize (fs, ser);

// Закрыть файл

fs.Close ( );

}

// Деериализовать двоичным форматизатором

static void DeserializeBinary ( )

{ // Создать ссылку на сериализованный объект

SerialThr ser = null;

// Открыть файл с сериализованным объектом

FileStream fs = new FileStream ("DataFile.out", FileMode.Open);

// Создать двоичный форматизатор

BinaryFormatter formatter = new BinaryFormatter ( );

// Десериализовать объект

ser = (SerialThr) formatter.Deserialize (fs);

ser.Start ( );

Thread.Sleep (100);

Console.WriteLine ("ser.Run= " + ser.Run

+ " ser.Life= " + ser.Life + " ser.N= " + ser.N );

ser.Finish ( );

Console.WriteLine ("ser.Run= " + ser.Run

+ " ser.Life= " + ser.Life + " ser.N= " + ser.N );

// Убедиться, что данные объекта сохранились

Console.WriteLine ("ser.Name= " + ser.Name);

// Закрыть файл

fs.Close ( );

}

}

Пример 9.6. Параллельное выполнение сериализуемого и десериализуемого объектов.

///////////////

// C#

// Подключить Project/AddReference System.Runtime.Serialization...

using System;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

using System.Threading;

// Класс сериализуемого объекта

[Serializable]

class SerialThr

{ private string name;

private bool life;

private bool run;

private int n= 0;

[field:NonSerialized]

Thread thr;

public SerialThr (string N )

{

name= N;

run= false;

}

// Свойство Name

public string Name {get {return name;}}

public bool Life {get {return life;}}

public bool Run {get {return run;}}

public int N {get {return n;}}

public void Start ( )

{ run= true;

life= true;

thr= new Thread (new ThreadStart (this.ThrFunc));

thr.Start ( );

}

public void Finish ( )

{ run= false;

life= false;

thr.Join ( );

}

private void ThrFunc ( )

{ while (life)

{ n++;

Console.WriteLine("n= " + n);

Thread.Sleep (30);

}

}

}

class App

{ static void Main()

{ // Создать сериализуемый объект и стартовать поток

SerialThr ser= new SerialThr ("name");

ser.Start ( );

Thread.Sleep (100);

Console.WriteLine ("ser.Name= " + ser.Name + " ser.Run= " +

ser.Run + " ser.Life= " + ser.Life + " ser.N= " + ser.N );

// Создать файл для сохранения сериализуемого объекта

FileStream fs = new FileStream ("DataFile.out", FileMode.Create);

// Создать двоичный форматизатор

BinaryFormatter formatter = new BinaryFormatter ( );

// Сериализировать объект ser

formatter.Serialize (fs, ser);

// Закрыть файл

fs.Close ( );

// Создать ссылку на сериализованный объект

SerialThr ser1 = null;

// Открыть файл с сериализованным объектом

FileStream fs1 = new FileStream ("DataFile.out", FileMode.Open);

// Создать двоичный форматизатор

BinaryFormatter formatter1 = new BinaryFormatter ( );

// Десериализовать объект

ser1 = (SerialThr) formatter.Deserialize (fs1);

// Закрыть файл

fs1.Close ( );

Console.WriteLine ("ser1.Name= " + ser1.Name + " ser1.Run= " +

ser1.Run + " ser1.Life= " + ser1.Life + " ser1.N= " + ser1.N );

// Стартовать поток десериализуемого объекта

ser1.Start ( );

Thread.Sleep (50);

// Завершить выполнение потоков двух объектов

ser1.Finish ( );

ser.Finish ( );

}

}

Соседние файлы в папке КОП-Примеры