Сериализация на данни

63

Upload: dylan

Post on 05-Jan-2016

57 views

Category:

Documents


0 download

DESCRIPTION

Програмиране за .NET Framework. http:// www.nakov.com / dotnet-project /. Сериализация на данни. Михаил Стойнов Софтуерен инженер , Sciant Inc. www.sciant.com Microsoft Student Consultant www.fmi.uni-sofia.bg/microsoft/. Необходими знания. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Сериализация на данни
Page 2: Сериализация на данни

Сериализация на данниСериализация на данни

Програмиране заПрограмиране за .NET Framework .NET Frameworkhttp://http://www.nakov.comwww.nakov.com//dotnet-projectdotnet-project//

Михаил СтойновМихаил СтойновСофтуерен инженер, SciantСофтуерен инженер, Sciant Inc.Inc. www.sciant.com

Microsoft Student ConsultantMicrosoft Student Consultantwww.fmi.uni-sofia.bg/microsoft/

Page 3: Сериализация на данни

Необходими знанияНеобходими знания Базови познания за Базови познания за .NET Framework .NET Framework и и CLRCLR

((Common Language Runtime)Common Language Runtime) Базови познания за общата система от Базови познания за общата система от

типове в типове в .NET (Common Type System).NET (Common Type System) Базови познания за библиотеката от Базови познания за библиотеката от

класове в класове в .NET (Framework Class Library).NET (Framework Class Library) Познания за езика Познания за езика C#C# Познания за потоци от данниПознания за потоци от данни Базови познания за Базови познания за ReflectionReflection Познания за Познания за AttributesAttributes Познания заПознания за работа с работа с XML XML в в .NET .NET

FrameworkFramework

Page 4: Сериализация на данни

СъдържаниеСъдържание

СериализацияСериализация

XML XML сериализациясериализация

Приложение: Приложение: FormatterServicesFormatterServices

Page 5: Сериализация на данни

СериализацияСериализация СериализацияСериализация

Какво Какво e e сериализация?сериализация? За какво се използва?За какво се използва? Защо сериализация?Защо сериализация? Как се сериализира?Как се сериализира? Видове форматВидове форматeeрири (Formatters) (Formatters) Процесът на сериализацияПроцесът на сериализация Малък пример – сериализацияМалък пример – сериализация Малък пример – десериализацияМалък пример – десериализация IDeserializationCallbackIDeserializationCallback ISerializableISerializable Контролиране на сериализациятаКонтролиране на сериализацията Streaming ContextsStreaming Contexts

XML XML СериализацияСериализация

Page 6: Сериализация на данни

Какво Какво ee сериализация? сериализация? Сериализация (Сериализация (SerializationSerialization))

Процес, който преобразува обект или Процес, който преобразува обект или свързан граф от обекти до поток от свързан граф от обекти до поток от байтовебайтове

Потокът може да бъде двоичен (Потокът може да бъде двоичен (binary) binary) или текстов (или текстов (XML)XML)

Десериализация (Десериализация (DeserializationDeserialization)) Процес, който връща поток от байтове Процес, който връща поток от байтове

обратно до обектиобратно до обекти

Напълно Напълно автоматизираниавтоматизирани процеси процеси Предоставят, обаче, средства за фин Предоставят, обаче, средства за фин

контролконтрол

Page 7: Сериализация на данни

За какво се използва?За какво се използва? Запазване на състоянието на обектЗапазване на състоянието на обект

Една програма може да съхрани Една програма може да съхрани състоянието си на носител (файл, БД)състоянието си на носител (файл, БД)

Предаване на обект през мрежаПредаване на обект през мрежа Две програми могат да си предават данниДве програми могат да си предават данни

.NET Framework .NET Framework го използва вътрешного използва вътрешно за запазване на за запазване на session statesession state-а в -а в ASP.NETASP.NET за копиране в за копиране в clipboard clipboard от от Windows FormsWindows Forms за предаване на обекти по стойност от за предаване на обекти по стойност от

един един Application Domain Application Domain в другв друг за дълбоко копиране (за дълбоко копиране (DeepDeep Copy)Copy) в в RRemotingemoting технологията технологията

Page 8: Сериализация на данни

За какво се използва? За какво се използва? (2)(2)

След като един обект бъде превърнат След като един обект бъде превърнат в поток от байтове, той може да бъдев поток от байтове, той може да бъде криптиранкриптиран компресиранкомпресиран

Всички тези процеси са прозрачниВсички тези процеси са прозрачни Не зависят от сериализирания обектНе зависят от сериализирания обект

Могат да се сериализират циклични Могат да се сериализират циклични графи от обекти, т.е. обекти, които се графи от обекти, т.е. обекти, които се реферират едни от другиреферират едни от други Форматерът сериализира всеки обект Форматерът сериализира всеки обект

само по веднъж – не влиза в безкраен само по веднъж – не влиза в безкраен цикълцикъл

Page 9: Сериализация на данни

Защо сериализация?Защо сериализация? Запазването на един обект може да се Запазването на един обект може да се

направи и ръчно, без сериализациянаправи и ръчно, без сериализация Представете си, обаче:Представете си, обаче:

бизнес приложение с 10 000 класабизнес приложение с 10 000 класа сложен граф от навързани обектисложен граф от навързани обекти код във всеки клас, който се справя с код във всеки клас, който се справя с

протоколипротоколи, , несъвпадане на типовете при несъвпадане на типовете при клиент/сървърклиент/сървър, , управление на грешкиуправление на грешки, , обекти сочещи към други обектиобекти сочещи към други обекти, , работа работа със структури, масивисъс структури, масиви, … , … При по-старите платформи се работеше такаПри по-старите платформи се работеше така

Сериализацията прави целия този Сериализацията прави целия този процес прозрачен и автоматиченпроцес прозрачен и автоматичен

Page 10: Сериализация на данни

Как се сериализира?Как се сериализира?String str = String str = "П"Пие ми се бираие ми се бира!"!";;BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter();using (using (Stream s = new FileStream(Stream s = new FileStream(""samplesample.bin.bin"")))){{ f.Serialize(s, str);f.Serialize(s, str);}}

Обектът, който ще се сериализираОбектът, който ще се сериализира Обектът може да бъде всякакъв тип – Обектът може да бъде всякакъв тип –

Int32Int32, , StringString, , DateTimeDateTime, , ExceptionException, , ImageImage, , ArrayListArrayList, , HashtableHashtable, , потребителски дефиниран клас, …потребителски дефиниран клас, …

За него има специални изисквания За него има специални изисквания (обяснени са по-късно)(обяснени са по-късно)

Page 11: Сериализация на данни

Как се сериализира?Как се сериализира?

Създаване на Създаване на форматерформатер ( (formatter)formatter) ФорматерътФорматерът е специален клас, който е специален клас, който

имплементира имплементира IFormatterIFormatter ФорматерътФорматерът извършва цялата извършва цялата

работа по сериализирането и работа по сериализирането и десериализирането на йерархия десериализирането на йерархия (граф) от обекти(граф) от обекти

String str = String str = "П"Пие ми се бираие ми се бира!"!";;BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter();using (using (Stream s = new FileStream(Stream s = new FileStream(""samplesample.bin.bin"")))){{ f.Serialize(s, str);f.Serialize(s, str);}}

Page 12: Сериализация на данни

Как се сериализира?Как се сериализира?

Потокът, в който ще се сериализират Потокът, в който ще се сериализират даннитеданните

Като параметър се очаква наследник Като параметър се очаква наследник на класа на класа System.IO.StreamSystem.IO.Stream Това означава, че обектът може да се Това означава, че обектът може да се

сериализира всериализира в MemoryStreamMemoryStream, , FileStreamFileStream, , NetworkStreamNetworkStream, , ……

String str = String str = "П"Пие ми се бираие ми се бира!"!";;BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter();using (using (Stream s = new FileStream(Stream s = new FileStream(""samplesample.bin.bin"")))){{ f.Serialize(f.Serialize(ss, str);, str);}}

Page 13: Сериализация на данни

Как се сериализира?Как се сериализира?

Самият процес на сериализацияСамият процес на сериализация Форматерът обхожда (чрез Форматерът обхожда (чрез reflectionreflection))

всички член-променливи на обектавсички член-променливи на обекта Видимостта на член-променливата няма Видимостта на член-променливата няма

значение – сериализират се всичкизначение – сериализират се всички Сериализират се само членове на Сериализират се само членове на

инстанцията, без статичните членовеинстанцията, без статичните членове

String str = String str = "П"Пие ми се бираие ми се бира!"!";;BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter();using (using (Stream s = new FileStream(Stream s = new FileStream(""samplesample.bin.bin"")))){{ f.Serialize(s, str);f.Serialize(s, str);}}

Page 14: Сериализация на данни

Видове форматери (Видове форматери (Formatters)Formatters) Форматерите съдържат логиката за Форматерите съдържат логиката за

форматиране на сериализираните обектиформатиране на сериализираните обекти CLR обхожда метаданните за член-CLR обхожда метаданните за член-

променливи и чрез reflection извлича променливи и чрез reflection извлича стойностите имстойностите им

Тези стойности се подават на форматераТези стойности се подават на форматера Форматери (Форматери (formatter) oformatter) oт т

System.Runtime.SerializationSystem.Runtime.Serialization BinaryFormatterBinaryFormatter SoapFormatterSoapFormatter потребителски дефиниранипотребителски дефинирани

Наследяват Наследяват FormatterFormatter – – абстрактен клас, абстрактен клас, даващ базова функционалностдаващ базова функционалност

Page 15: Сериализация на данни

Процесът на сериализиранеПроцесът на сериализиране“AssemblyName, Version=1.0.1809.36302, Culture=neutral, PublicKeyToken=null”“DataClass”“The name is Data Class”“Some Data”34980357

Internet

Database

STREAM

“AssemblyName, Version=1.0.1809.36302, Culture=neutral, PublicKeyToken=null”“DataClass”“The name is Data Class”“Some Data”34980357

[Serializable] class DataClass {

string Name = “The name is Data Class”;string text = “Some Data”;[NonSerialized] string No = null;int ID = 34980357;public void Method1(){…}public int GetLength{ get{…} set{..} }

}

STREAM

[Serializable] class DataClass {

string Name = “The name is Data Class”;string text = “Some Data”;[NonSerialized] string No = “NonSerial”;int ID = 34980357;public void Method1(){…}public int GetLength{ get{…} set{..} }

}

Page 16: Сериализация на данни

Малък пример – сериализацияМалък пример – сериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int public int NNumber;umber; [NonSerialized] public int [NonSerialized] public int IdId;; public string public string NName;ame;}}class Serializerclass Serializer{{ public void Serialize()public void Serialize() {{ FirstExample obj = new FirstExample();FirstExample obj = new FirstExample(); BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (Stream stream = new FileStream("x.bin"))using (Stream stream = new FileStream("x.bin")) {{ f.Serialize(stream, obj);f.Serialize(stream, obj); }} }} public void Deserialize() {...}public void Deserialize() {...}}}

Page 17: Сериализация на данни

Малък пример – сериализацияМалък пример – сериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int public int NNumber;umber; [NonSerialized] public int [NonSerialized] public int IdId;; public string public string NName;ame;}}class Serializerclass Serializer{{ public void Serialize()public void Serialize() {{ FirstExample obj = new FirstExample();FirstExample obj = new FirstExample(); BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (Stream stream = new FileStream("x.bin"))using (Stream stream = new FileStream("x.bin")) {{ f.Serialize(stream, obj);f.Serialize(stream, obj); }} }} public void Deserialize() {...}public void Deserialize() {...}}}

Page 18: Сериализация на данни

Малък пример – сериализацияМалък пример – сериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int public int NNumber;umber; [NonSerialized] public int [NonSerialized] public int IdId;; public string public string NName;ame;}}class Serializerclass Serializer{{ public void Serialize()public void Serialize() {{ FirstExample obj = new FirstExample();FirstExample obj = new FirstExample(); BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (Stream stream = new FileStream("x.bin"))using (Stream stream = new FileStream("x.bin")) {{ f.Serialize(stream, obj);f.Serialize(stream, obj); }} }} public void Deserialize() {...}public void Deserialize() {...}}}

Page 19: Сериализация на данни

Малък пример – сериализацияМалък пример – сериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int Number;public int Number; [NonSerialized][NonSerialized] public int Id; public int Id; public string Name;public string Name;}}class Serializerclass Serializer{{ public void Serialize()public void Serialize() {{ FirstExample obj = new FirstExample();FirstExample obj = new FirstExample(); BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (Stream stream = new FileStream("x.bin"))using (Stream stream = new FileStream("x.bin")) {{ f.Serialize(stream, obj);f.Serialize(stream, obj); }} }} public void Deserialize() {...}public void Deserialize() {...}}}

Page 20: Сериализация на данни

Малък пример – сериализацияМалък пример – сериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int Number;public int Number; [NonSerialized] public int Id;[NonSerialized] public int Id; public string Name;public string Name;}}class Serializerclass Serializer{{ public void Serialize()public void Serialize() {{ FirstExample obj = new FirstExample();FirstExample obj = new FirstExample(); BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (Stream stream = new FileStream("x.bin"))using (Stream stream = new FileStream("x.bin")) {{ f.Serialize(stream, obj);f.Serialize(stream, obj); }} }} public void Deserialize() {...}public void Deserialize() {...}}}

Page 21: Сериализация на данни

Малък пример – сериализацияМалък пример – сериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int Number;public int Number; [NonSerialized] public int Id;[NonSerialized] public int Id; public string Name;public string Name;}}class Serializerclass Serializer{{ public void Serialize()public void Serialize() {{ FirstExample obj = new FirstExample();FirstExample obj = new FirstExample(); BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (Stream stream = new FileStream("x.bin"))using (Stream stream = new FileStream("x.bin")) {{ f.Serialize(stream, obj);f.Serialize(stream, obj); }} }} public void Deserialize() {...}public void Deserialize() {...}}}

Page 22: Сериализация на данни

Малък пример – сериализацияМалък пример – сериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int Number;public int Number; [NonSerialized] public int Id;[NonSerialized] public int Id; public string Name;public string Name;}}class Serializerclass Serializer{{ public void Serialize()public void Serialize() {{ FirstExample obj = new FirstExample();FirstExample obj = new FirstExample(); BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (Stream stream = new FileStream("x.bin"))using (Stream stream = new FileStream("x.bin")) {{ f.Serialize(stream, obj);f.Serialize(stream, obj); }} }} public void Deserialize() {...}public void Deserialize() {...}}}

Page 23: Сериализация на данни

Малък пример – сериализацияМалък пример – сериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int Number;public int Number; [NonSerialized] public int Id;[NonSerialized] public int Id; public string Name;public string Name;}}class Serializerclass Serializer{{ public void Serialize()public void Serialize() {{ FirstExample obj = new FirstExample();FirstExample obj = new FirstExample(); BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (using (Stream stream = new FileStream("x.bin")Stream stream = new FileStream("x.bin"))) {{ f.Serialize(stream, obj);f.Serialize(stream, obj); }} }} public void Deserialize() {...}public void Deserialize() {...}}}

Page 24: Сериализация на данни

Малък пример – сериализацияМалък пример – сериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int Number;public int Number; [NonSerialized] public int Id;[NonSerialized] public int Id; public string Name;public string Name;}}class Serializerclass Serializer{{ public void Serialize()public void Serialize() {{ FirstExample obj = new FirstExample();FirstExample obj = new FirstExample(); BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (Stream stream = new FileStream("x.bin"))using (Stream stream = new FileStream("x.bin")) {{ f.Serialize(stream, obj);f.Serialize(stream, obj); }} }} public void Deserialize() {...}public void Deserialize() {...}}}

Page 25: Сериализация на данни

Малък пример – десериализацияМалък пример – десериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int Number;public int Number; [NonSerialized] public int Id;[NonSerialized] public int Id; public string Name;public string Name;}}class Serializerclass Serializer{{ public void Serialize() {...}public void Serialize() {...} public void Deserialize()public void Deserialize() {{ BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (Stream stream = new FileStream("x.bin"))using (Stream stream = new FileStream("x.bin")) {{ FirstExample fe = (FirstExample)FirstExample fe = (FirstExample) f.Deserialize(stream);f.Deserialize(stream); }} }}}}

Page 26: Сериализация на данни

Малък пример – десериализацияМалък пример – десериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int Number;public int Number; [NonSerialized] public int Id;[NonSerialized] public int Id; public string Name;public string Name;}}class Serializerclass Serializer{{ public void Serialize() {...}public void Serialize() {...} public void Deserialize()public void Deserialize() {{ BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (Stream stream = new FileStream("x.bin"))using (Stream stream = new FileStream("x.bin")) {{ FirstExample fe = (FirstExample)FirstExample fe = (FirstExample) f.Deserialize(stream);f.Deserialize(stream); }} }}}}

Page 27: Сериализация на данни

Малък пример – десериализацияМалък пример – десериализацияusing System.IO;using System.IO;using System.Runtime.Serialization.Formatters;using System.Runtime.Serialization.Formatters;[Serializable][Serializable]class FirstExampleclass FirstExample{{ public int Number;public int Number; [NonSerialized] public int Id;[NonSerialized] public int Id; public string Name;public string Name;}}class Serializerclass Serializer{{ public void Serialize() {...}public void Serialize() {...} public void Deserialize()public void Deserialize() {{ BinaryFormatter f = new BinaryFormatter();BinaryFormatter f = new BinaryFormatter(); using (Stream stream = new FileStream("x.bin"))using (Stream stream = new FileStream("x.bin")) {{ FirstExample fe = FirstExample fe = (FirstExample)(FirstExample) f.Deserialize(stream);f.Deserialize(stream); }} }}}}

Page 28: Сериализация на данни

Демонстрация Демонстрация ##11 Бинарна сериализацияБинарна сериализация

Page 29: Сериализация на данни

Демонстрация Демонстрация #2#2 Сериализация по мрежатаСериализация по мрежата

Page 30: Сериализация на данни

Демонстрация Демонстрация #3#3 Дълбоко копиране на обектиДълбоко копиране на обекти

Page 31: Сериализация на данни

IDeserializationCallbackIDeserializationCallback Има случаи, в които се налагаИма случаи, в които се налага,, след след

като обектът е десериализиран, да се като обектът е десериализиран, да се направят някои допълнителни нещанаправят някои допълнителни неща

Потребителят наследява Потребителят наследява IDeserializationCallbackIDeserializationCallback и и имплементира метода имплементира метода OnDeserializationOnDeserialization()()

CLR CLR изпълнява метода след пълната изпълнява метода след пълната десериализация на обектадесериализация на обекта Сигурно е, че в момента на изпълнение Сигурно е, че в момента на изпълнение

на метода всички членна метода всички член--променливи са променливи са вече десериализиранивече десериализирани

Page 32: Сериализация на данни

Демонстрация Демонстрация #4#4

IDeserializationCallbackIDeserializationCallback

Page 33: Сериализация на данни

ISerializableISerializable Позволява предефиниране на Позволява предефиниране на

автоматичната сериализацияавтоматичната сериализация

1.1. ..ctor(SerializationInfoctor(SerializationInfo info, info, StreamingContext context)StreamingContext context) Не забравяйте Не забравяйте ::base(infobase(info, context), context)

2.2. ISerializable.GetObjectData(ISerializable.GetObjectData( SerializSerializationInfoationInfo info, StreamingContext info, StreamingContext context)context) Не забравяйте Не забравяйте base.GetObjectData(infobase.GetObjectData(info, ,

context)context) Забележка: НЗабележка: Не забравяйте конструкторае забравяйте конструктора, ,

защото компилаторът няма как да ви защото компилаторът няма как да ви принуди да го напишетепринуди да го напишете

Page 34: Сериализация на данни

Контролиране на сериализациятаКонтролиране на сериализациятаusing System.Runtime.Serialization;using System.Runtime.Serialization;

[Serializable][Serializable]class Person : ISerializableclass Person : ISerializable{{ private string mName;private string mName; private int mAge;private int mAge;

private Person(SerializationInfo aInfo,private Person(SerializationInfo aInfo, StreamingContext aContext)StreamingContext aContext) {{ mName = (string)аInfo.GetString("Person's name"); mName = (string)аInfo.GetString("Person's name"); mAge = aInfo.GetInt32("Person's age");mAge = aInfo.GetInt32("Person's age"); }}

void ISerializable.GetObjectData(SerializationInfovoid ISerializable.GetObjectData(SerializationInfo aInfo, StreamingContext aContext)aInfo, StreamingContext aContext) {{ aInfo.AddValue("Person's name", mName);aInfo.AddValue("Person's name", mName); aInfo.AddValue("Person's age", mAge);aInfo.AddValue("Person's age", mAge); }}}}

Page 35: Сериализация на данни

Контролиране на сериализациятаКонтролиране на сериализациятаusing System.Runtime.Serialization;using System.Runtime.Serialization;

[Serializable][Serializable]class Person : class Person : ISerializableISerializable{{ private string mName;private string mName; private int mAge;private int mAge;

private Person(SerializationInfo aInfo,private Person(SerializationInfo aInfo, StreamingContext aContext)StreamingContext aContext) {{ mName = (string)aInfo.GetString("Person's name"); mName = (string)aInfo.GetString("Person's name"); mAge = aInfo.GetInt32("Person's age");mAge = aInfo.GetInt32("Person's age"); }}

void void ISerializableISerializable.GetObjectData(SerializationInfo.GetObjectData(SerializationInfo aInfo, StreamingContext aContext)aInfo, StreamingContext aContext) {{ aInfo.AddValue("Person's name", mName);aInfo.AddValue("Person's name", mName); aInfo.AddValue("Person's age", mAge);aInfo.AddValue("Person's age", mAge); }}}}

Page 36: Сериализация на данни

Контролиране на сериализациятаКонтролиране на сериализациятаusing System.Runtime.Serialization;using System.Runtime.Serialization;

[Serializable][Serializable]class Person : ISerializableclass Person : ISerializable{{ private string mName;private string mName; private int mAge;private int mAge;

private Person(SerializationInfo aInfo,private Person(SerializationInfo aInfo, StreamingContext aContext)StreamingContext aContext) {{ mName = (string)аInfo.GetString("Person's name"); mName = (string)аInfo.GetString("Person's name"); mAge = aInfo.GetInt32("Person's age");mAge = aInfo.GetInt32("Person's age"); }}

void ISerializable.GetObjectData(SerializationInfovoid ISerializable.GetObjectData(SerializationInfo aInfo, StreamingContext aContext)aInfo, StreamingContext aContext) {{ aInfo.AddValue("Person's name", mName);aInfo.AddValue("Person's name", mName); aInfo.AddValue("Person's age", mAge);aInfo.AddValue("Person's age", mAge); }}}}

Page 37: Сериализация на данни

Контролиране на сериализациятаКонтролиране на сериализациятаusing System.Runtime.Serialization;using System.Runtime.Serialization;

[Serializable][Serializable]class Person : ISerializableclass Person : ISerializable{{ private string mName;private string mName; private int mAge;private int mAge;

private Person(SerializationInfo aInfo,private Person(SerializationInfo aInfo, StreamingContext aContext)StreamingContext aContext) {{ mName = (string)аInfo.GetString("Person's name"); mName = (string)аInfo.GetString("Person's name"); mAge = aInfo.GetInt32("Person's age");mAge = aInfo.GetInt32("Person's age"); }}

void ISerializable.GetObjectData(void ISerializable.GetObjectData(SerializationInfoSerializationInfo aInfoaInfo, StreamingContext aContext), StreamingContext aContext) {{ aInfo.AddValue("Person's name", mName);aInfo.AddValue("Person's name", mName); aInfo.AddValue("Person's age", mAge);aInfo.AddValue("Person's age", mAge); }}}}

Page 38: Сериализация на данни

Контролиране на сериализациятаКонтролиране на сериализациятаusing System.Runtime.Serialization;using System.Runtime.Serialization;

[Serializable][Serializable]class Person : ISerializableclass Person : ISerializable{{ private string mName;private string mName; private int mAge;private int mAge;

private Person(private Person(SerializationInfo aInfo,SerializationInfo aInfo, StreamingContext aContext)StreamingContext aContext) {{ mName = (string)аInfo.GetString("Person's name"); mName = (string)аInfo.GetString("Person's name"); mAge = aInfo.GetInt32("Person's age");mAge = aInfo.GetInt32("Person's age"); }}

void ISerializable.GetObjectData(SerializationInfovoid ISerializable.GetObjectData(SerializationInfo aInfo, StreamingContext aContext)aInfo, StreamingContext aContext) {{ aInfo.AddValue("Person's name", mName);aInfo.AddValue("Person's name", mName); aInfo.AddValue("Person's age", mAge);aInfo.AddValue("Person's age", mAge); }}}}

Page 39: Сериализация на данни

Контролиране на сериализациятаКонтролиране на сериализациятаusing System.Runtime.Serialization;using System.Runtime.Serialization;

[Serializable][Serializable]class Person : ISerializableclass Person : ISerializable{{ private string mName;private string mName; private int mAge;private int mAge;

private Person(SerializationInfo aInfo,private Person(SerializationInfo aInfo, StreamingContext aContextStreamingContext aContext)) {{ mName = (string)аInfo.GetString("Person's name"); mName = (string)аInfo.GetString("Person's name"); mAge = aInfo.GetInt32("Person's age");mAge = aInfo.GetInt32("Person's age"); }}

void ISerializable.GetObjectData(SerializationInfovoid ISerializable.GetObjectData(SerializationInfo aInfo, aInfo, StreamingContext aContextStreamingContext aContext)) {{ aInfo.AddValue("Person's name", mName);aInfo.AddValue("Person's name", mName); aInfo.AddValue("Person's age", mAge);aInfo.AddValue("Person's age", mAge); }}}}

Page 40: Сериализация на данни

Демонстрация Демонстрация #5#5 Ръчна сериализация с Ръчна сериализация с ISerializableISerializable

Page 41: Сериализация на данни

Streaming ContextsStreaming Contexts Указват къде се сериализира обектътУказват къде се сериализира обектът

CrossProcess(0x0001), CrossProcess(0x0001), CrossMachines(0x0002), CrossMachines(0x0002), File(0x0004), Persistence(0x0008), File(0x0004), Persistence(0x0008), Remoting(0x0010), Other(0x0020), Remoting(0x0010), Other(0x0020), Clone(0x0040), Clone(0x0040), CrossAppDomain(0x0080), All(0x00FFCrossAppDomain(0x0080), All(0x00FF))

Форматерът заявява за какво иска да Форматерът заявява за какво иска да сериализира, обектът решава как да сериализира, обектът решава как да реагира:реагира: да сериализира различен брой параметрида сериализира различен брой параметри да хвърли изключение, …да хвърли изключение, …

Page 42: Сериализация на данни

XML XML сериализация сериализация (съдържание)(съдържание)

СериализацияСериализация

XML XML сериализациясериализация Какво е Какво е XML XML сериализация?сериализация?

Контролиране на изходния Контролиране на изходния XMLXML

Контрол на сериализациятаКонтрол на сериализацията

Page 43: Сериализация на данни

Какво е Какво е XML XML сериализация?сериализация? Записването на публичните полета в Записването на публичните полета в XMLXML

формат с цел съхранение или транспортформат с цел съхранение или транспорт XML XML десериализация – обратният процесдесериализация – обратният процес XML XML сериализацията е част от поддръжката сериализацията е част от поддръжката

на на XML XML в в .NET.NET FrameworkFramework Забележка:Забележка: Сериализират се само Сериализират се само

публични членовепублични членове!! XML XML сериализацията не може да се справи сериализацията не може да се справи

с циклично свързани графи от обектис циклично свързани графи от обекти XML XML сериализацията може да сериализира сериализацията може да сериализира

всякакви обекти (няма изискваниявсякакви обекти (няма изисквания)) Изисква се конструктор без параметриИзисква се конструктор без параметри

Page 44: Сериализация на данни

XMLXML сериализация – пример сериализация – примерpublic class Studentpublic class Student{{ public string Name;public string Name; public int Age;public int Age;

public void SerializeToXml(Stream aStream)public void SerializeToXml(Stream aStream) {{ XmlSerializerXmlSerializer xmlSerializer = xmlSerializer = new XmlSerializer(typeof(Student));new XmlSerializer(typeof(Student)); xmlSerializer.xmlSerializer.SerializeSerialize(aStream, this);(aStream, this); }}

public static Student DeserializeFromXml(public static Student DeserializeFromXml( Stream aStream)Stream aStream) {{ XmlSerializerXmlSerializer xmlSerializer = xmlSerializer = new XmlSerializer(typeof(Student));new XmlSerializer(typeof(Student)); returnreturn (Student) (Student) xmlSerializer.xmlSerializer.DeserializeDeserialize(aStream);(aStream); }}}}

Page 45: Сериализация на данни

Демонстрация Демонстрация #6#6 Проста Проста XMLXML сериализация сериализация

Page 46: Сериализация на данни

Контролиране на изходния Контролиране на изходния XMLXML Осъществява се с атрибутиОсъществява се с атрибути

using System.Xml.Serialization;using System.Xml.Serialization;public class OptionalOrderpublic class OptionalOrder{{ [XmlElement(ElementName = "Tax_Rate")][XmlElement(ElementName = "Tax_Rate")] public decimal TaxRate;public decimal TaxRate;

[XmlAttribute][XmlAttribute] public string FirstOrder;public string FirstOrder;

[XmlIgnoreAttribute][XmlIgnoreAttribute] public bool FirstOrderSpecified;public bool FirstOrderSpecified;

[XmlArrayAttribute("Items")][XmlArrayAttribute("Items")] [XmlArrayItem("MemberName")][XmlArrayItem("MemberName")] public OrderedItem[] OrderedItems;public OrderedItem[] OrderedItems;

[XmlElement][XmlElement] public Employee[] Employees;public Employee[] Employees;}}

Page 47: Сериализация на данни

Контролиране на изходния Контролиране на изходния XMLXML Осъществява се с атрибутиОсъществява се с атрибути

using System.Xml.Serialization;using System.Xml.Serialization;public class OptionalOrderpublic class OptionalOrder{{ [XmlElement(ElementName = "Tax_Rate")][XmlElement(ElementName = "Tax_Rate")] public decimal TaxRate;public decimal TaxRate;

[XmlAttribute][XmlAttribute] public string FirstOrder;public string FirstOrder;

[XmlIgnoreAttribute][XmlIgnoreAttribute] public bool FirstOrderSpecified;public bool FirstOrderSpecified;

[XmlArrayAttribute("Items")][XmlArrayAttribute("Items")] [XmlArrayItem("MemberName")][XmlArrayItem("MemberName")] public OrderedItem[] OrderedItems;public OrderedItem[] OrderedItems;

[XmlElement][XmlElement] public Employee[] Employees;public Employee[] Employees;}}

Page 48: Сериализация на данни

Контролиране на изходния Контролиране на изходния XMLXML Осъществява се с атрибутиОсъществява се с атрибути

using System.Xml.Serialization;using System.Xml.Serialization;public class OptionalOrderpublic class OptionalOrder{{ [XmlElement(ElementName = "Tax_Rate")][XmlElement(ElementName = "Tax_Rate")] public decimal TaxRate;public decimal TaxRate;

[XmlAttribute][XmlAttribute] public string FirstOrder;public string FirstOrder;

[XmlIgnoreAttribute][XmlIgnoreAttribute] public bool FirstOrderSpecified;public bool FirstOrderSpecified;

[XmlArrayAttribute("Items")][XmlArrayAttribute("Items")] [XmlArrayItem("MemberName")][XmlArrayItem("MemberName")] public OrderedItem[] OrderedItems;public OrderedItem[] OrderedItems;

[XmlElement][XmlElement] public Employee[] Employees;public Employee[] Employees;}}

Page 49: Сериализация на данни

Контролиране на изходния Контролиране на изходния XMLXML Осъществява се с атрибутиОсъществява се с атрибути

using System.Xml.Serialization;using System.Xml.Serialization;public class OptionalOrderpublic class OptionalOrder{{ [XmlElement(ElementName = "Tax_Rate")][XmlElement(ElementName = "Tax_Rate")] public decimal TaxRate;public decimal TaxRate;

[XmlAttribute][XmlAttribute] public string FirstOrder;public string FirstOrder;

[XmlIgnoreAttribute][XmlIgnoreAttribute] public bool FirstOrderSpecified;public bool FirstOrderSpecified;

[XmlArrayAttribute("Items")][XmlArrayAttribute("Items")] [XmlArrayItem("MemberName")][XmlArrayItem("MemberName")] public OrderedItem[] OrderedItems;public OrderedItem[] OrderedItems;

[XmlElement][XmlElement] public Employee[] Employees;public Employee[] Employees;}}

Page 50: Сериализация на данни

Контролиране на изходния Контролиране на изходния XMLXML Осъществява се с атрибутиОсъществява се с атрибути

using System.Xml.Serialization;using System.Xml.Serialization;public class OptionalOrderpublic class OptionalOrder{{ [XmlElement(ElementName = "Tax_Rate")][XmlElement(ElementName = "Tax_Rate")] public decimal TaxRate;public decimal TaxRate;

[XmlAttribute][XmlAttribute] public string FirstOrder;public string FirstOrder;

[XmlIgnoreAttribute][XmlIgnoreAttribute] public bool FirstOrderSpecified;public bool FirstOrderSpecified;

[XmlArrayAttribute("Items")][XmlArrayAttribute("Items")] [XmlArrayItem("MemberName")][XmlArrayItem("MemberName")] public OrderedItem[] OrderedItems;public OrderedItem[] OrderedItems;

[XmlElement][XmlElement] public Employee[] Employees;public Employee[] Employees;}}

Page 51: Сериализация на данни

Контролиране на изходния Контролиране на изходния XMLXML Осъществява се с атрибутиОсъществява се с атрибути

using System.Xml.Serialization;using System.Xml.Serialization;public class OptionalOrderpublic class OptionalOrder{{ [XmlElement(ElementName = "Tax_Rate")][XmlElement(ElementName = "Tax_Rate")] public decimal TaxRate;public decimal TaxRate;

[XmlAttribute][XmlAttribute] public string FirstOrder;public string FirstOrder;

[XmlIgnoreAttribute][XmlIgnoreAttribute] public bool FirstOrderSpecified;public bool FirstOrderSpecified;

[XmlArrayAttribute("Items")][XmlArrayAttribute("Items")] [XmlArrayItem("MemberName")][XmlArrayItem("MemberName")] public OrderedItem[] OrderedItems;public OrderedItem[] OrderedItems;

[XmlElement][XmlElement] public Employee[] Employees;public Employee[] Employees;}}

Page 52: Сериализация на данни

Демонстрация Демонстрация #7#7 Контрол на Контрол на XMLXML сериализацията сериализацията

Page 53: Сериализация на данни

Външен контрол на сериализациятаВъншен контрол на сериализацията

Механизъм, контролиращ Механизъм, контролиращ XML XML сериализацията извън обектасериализацията извън обекта Прилича на контрола с атрибутиПрилича на контрола с атрибути

Използва се, ако нямаме достъп до Използва се, ако нямаме достъп до изходния код на класаизходния код на класа

Функционалността е същата като при Функционалността е същата като при контролирането на сериализацията с контролирането на сериализацията с атрибутиатрибути Дори класовете са същите, само Дори класовете са същите, само

механизмът за добавяне е различенмеханизмът за добавяне е различен

Page 54: Сериализация на данни

Реализира се чрез класовете Реализира се чрез класовете XmlAttributeOverridesXmlAttributeOverrides и и XmlAttributesXmlAttributes

За всеки член на даден клас се задава За всеки член на даден клас се задава колекция колекция XmlAttributesXmlAttributes, описваща , описваща формата на изходния формата на изходния XMLXML

Пример: промяна на име на елементПример: промяна на име на елемент

XmlAttributeOverrides overrides =XmlAttributeOverrides overrides = new XmlAttributeOverrides();new XmlAttributeOverrides();XmlAttributes attribs = new XmlAttributes();XmlAttributes attribs = new XmlAttributes();attribs.XmlElements.Add(attribs.XmlElements.Add( new XmlElementAttribute("PersonName"));new XmlElementAttribute("PersonName"));overrides.Add(typeof(Person), "Name", attribs);overrides.Add(typeof(Person), "Name", attribs);XmlSerializer xmlSerializer =XmlSerializer xmlSerializer = new XmlSerializer(typeof(Person), overrides);new XmlSerializer(typeof(Person), overrides);......

Външен контрол на сериализациятаВъншен контрол на сериализацията

Page 55: Сериализация на данни

Демонстрация Демонстрация #8#8 Външен контрол на сериализациятаВъншен контрол на сериализацията

Page 56: Сериализация на данни

Сериализация на данниСериализация на данни

Въпроси?Въпроси?

Page 57: Сериализация на данни

Приложение: Приложение: FormatterServicesFormatterServices Специален клас Специален клас System.Runtime. System.Runtime.

Serialization.FormatterServicesSerialization.FormatterServices Методи за сериализацияМетоди за сериализация

public static MemberInfo[] public static MemberInfo[] GetSerializableMembers(Type type)GetSerializableMembers(Type type)

public static Object[] public static Object[] GetObjectData(Object obj, MemberInfo[] GetObjectData(Object obj, MemberInfo[] members)members)

Методи за десериализацияМетоди за десериализация public static Type public static Type

GetTypeFromAssembly( Assembly assem, GetTypeFromAssembly( Assembly assem, String name)String name)

public static Object public static Object GetUninitializedObject(Type type)GetUninitializedObject(Type type)

public static Object public static Object PopulateObjectMembers(Object obj, PopulateObjectMembers(Object obj, MemberInfo[] members, Object[] data)MemberInfo[] members, Object[] data)

Page 58: Сериализация на данни

ЗадачиЗадачи1.1. Да се дефинираДа се дефинира класклас GraphGraph, който описва насочен , който описва насочен

графграф ( (представен като масив от върхове). представен като масив от върхове). Да се Да се дефинира класдефинира клас NodeNode, който описва един връх от , който описва един връх от графа. Класът графа. Класът NodeNode трябва да съдържа трябва да съдържа информационна част (текстово поле) и масив от информационна част (текстово поле) и масив от наследници (инстанции нанаследници (инстанции на същиясъщия клас клас NodeNode)). . Реализирайте функционалност, която сериализира Реализирайте функционалност, която сериализира и десериализира и десериализира инстанции на класа инстанции на класа GraphGraph..

2.2. Опитайте се да сериализирате бинарно инстанция Опитайте се да сериализирате бинарно инстанция на класа на класа System.Collections.HashtableSystem.Collections.Hashtable. . Опитайте след това да сериализирате хеш-таблица Опитайте след това да сериализирате хеш-таблица с с XMLXML сериализация сериализация. Какви проблеми възникват? . Какви проблеми възникват? Можете ли да обясните защо XML сериализацията Можете ли да обясните защо XML сериализацията не работи? Предложете алтернативно решение.не работи? Предложете алтернативно решение.

Page 59: Сериализация на данни

ЗадачиЗадачи3.3. Дефинирайте класове Дефинирайте класове CountryCountry и и TownTown, , които които

съдържат информация за държави и градове. съдържат информация за държави и градове. Може да считате, че в една държава има много Може да считате, че в една държава има много градове. Реализирайте бинарна и градове. Реализирайте бинарна и XML XML сериализация и десериализация за тези класове.сериализация и десериализация за тези класове. Реализирайте Реализирайте TCPTCP сървър, който по име на сървър, който по име на държава връща информация за държавата заедно държава връща информация за държавата заедно с всички градове в нея (във вид на бинарно с всички градове в нея (във вид на бинарно сериализиран сериализиран CountryCountry обект). Реализирайте обект). Реализирайте Windows Forms Windows Forms клиентско приложение за клиентско приложение за TCPTCP сървъра, което позволява да се извлича и сървъра, което позволява да се извлича и визуализира информация за държавите. Клиентът визуализира информация за държавите. Клиентът и сървърът трябва да поддържат два режима на и сървърът трябва да поддържат два режима на работа – с бинарна сериализация и с работа – с бинарна сериализация и с XMLXML сериализация.сериализация.

Page 60: Сериализация на данни

ЗадачиЗадачи4.4. Обяснете защо Обяснете защо SoapFormatterSoapFormatter може да може да

сериализира цикличен граф от обекти, а XML сериализира цикличен граф от обекти, а XML сериализацията не може. сериализацията не може. Упътване: създайте Упътване: създайте цикличен граф от обекти, сериализайте го по цикличен граф от обекти, сериализайте го по двата начина и сравнете изходните XML-и.двата начина и сравнете изходните XML-и.

5.5. Създайте клас Създайте клас StudentStudent описващ студент (курс, описващ студент (курс, група, поток, специалност, факултетен номер, e-група, поток, специалност, факултетен номер, e-mail, изучавани предмети и оценка по всеки mail, изучавани предмети и оценка по всеки изучаван предмет). XML сериализирайте този клас, изучаван предмет). XML сериализирайте този клас, като направите факултетния номер да се записва като направите факултетния номер да се записва като XML атрибут, а не като XML елемент. като XML атрибут, а не като XML елемент. Реализирайте контрола над формата на изходния Реализирайте контрола над формата на изходния XMLXML документ по два начина – документ по два начина – с атрибути в класа с атрибути в класа и чрез и чрез XmlAttributeOverridesXmlAttributeOverrides извън класа. извън класа.

Page 61: Сериализация на данни

MSDN LibraryMSDN Library Object Serialization in the .NET FrameworkObject Serialization in the .NET Framework System.Runtime.Serialization NamespaceSystem.Runtime.Serialization Namespace System.Runtime.Serialization.Formatters System.Runtime.Serialization.Formatters

NamespaceNamespace System.Runtime.Serialization.Formatters.Binary System.Runtime.Serialization.Formatters.Binary

NamespaceNamespace System.Runtime.Serialization.Formatters.Soap System.Runtime.Serialization.Formatters.Soap

NamespaceNamespace System.Xml.Serialization NamespaceSystem.Xml.Serialization Namespace XmlSerializer ClassXmlSerializer Class Controlling XML Serialization Using AttributesControlling XML Serialization Using Attributes Overriding XML SerializationOverriding XML Serialization

Използвана литератураИзползвана литература

Page 62: Сериализация на данни

MSDN LibraryMSDN Library Attributes That Control Encoded SOAP Attributes That Control Encoded SOAP

SerializationSerialization ААttributes That Control XML Serializationttributes That Control XML Serialization The XML Schema Definition Tool and XML The XML Schema Definition Tool and XML

SerializationSerialization Generating SOAP Messages With XML Generating SOAP Messages With XML

SerializationSerialization Vyacheslav BiktagirovVyacheslav Biktagirov, , .NET Serialization.NET Serialization – –

http://www.csharphelp.com/archives/archive38.htmlhttp://www.csharphelp.com/archives/archive38.html Mickey WilliamsMickey Williams, , CodeGuru: .NET SerializationCodeGuru: .NET Serialization – –

http://www.codeguru.com/columns/DotNet/article.phphttp://www.codeguru.com/columns/DotNet/article.php/c6595//c6595/

Използвана литератураИзползвана литература

Page 63: Сериализация на данни

Ali SufyanAli Sufyan, , CodeGuru: Object Serialization CodeGuru: Object Serialization Using .NETUsing .NET – – http://www.codeguru.com/Csharp/Csharp/http://www.codeguru.com/Csharp/Csharp/ cs_syntax/serialization/article.php/c7201/cs_syntax/serialization/article.php/c7201/

Jeffrey RichterJeffrey Richter, , .NET: Run-time Serialization .NET: Run-time Serialization –– MSDN MSDN Magazine, April 2002Magazine, April 2002 – – http://msdn.microsoft.com/http://msdn.microsoft.com/ msdnmag/issues/02/04/net/msdnmag/issues/02/04/net/

Jeffrey RichterJeffrey Richter, , .NET: Run-time Serialization, Part 2 .NET: Run-time Serialization, Part 2 – – MSDN Magazine, September 2002MSDN Magazine, September 2002 – – http://msdn.http://msdn. microsoft.com/msdnmag/issues/02/07/net/microsoft.com/msdnmag/issues/02/07/net/

Jeffrey RichterJeffrey Richter, , .NET: Run-time Serialization, Part 3 .NET: Run-time Serialization, Part 3 – – MSDN Magazine, September 2002MSDN Magazine, September 2002 – – http://msdn.http://msdn. microsoft.com/msdnmag/issues/02/09/net/microsoft.com/msdnmag/issues/02/09/net/

Използвана литератураИзползвана литература