
КОП-Примеры / Сериализация
.docПример 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 ( );
}
}