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

Post on 05-Jan-2016

58 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

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

Програмиране заПрограмиране за .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/

Необходими знанияНеобходими знания Базови познания за Базови познания за .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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как се сериализира?Как се сериализира?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, , потребителски дефиниран клас, …потребителски дефиниран клас, …

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

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

Създаване на Създаване на форматерформатер ( (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);}}

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

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

Като параметър се очаква наследник Като параметър се очаква наследник на класа на класа 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);}}

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

Самият процес на сериализацияСамият процес на сериализация Форматерът обхожда (чрез Форматерът обхожда (чрез 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);}}

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

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

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

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

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

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

Процесът на сериализиранеПроцесът на сериализиране“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{..} }

}

Малък пример – сериализацияМалък пример – сериализация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() {...}}}

Малък пример – сериализацияМалък пример – сериализация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() {...}}}

Малък пример – сериализацияМалък пример – сериализация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() {...}}}

Малък пример – сериализацияМалък пример – сериализация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() {...}}}

Малък пример – сериализацияМалък пример – сериализация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() {...}}}

Малък пример – сериализацияМалък пример – сериализация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() {...}}}

Малък пример – сериализацияМалък пример – сериализация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() {...}}}

Малък пример – сериализацияМалък пример – сериализация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() {...}}}

Малък пример – сериализацияМалък пример – сериализация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() {...}}}

Малък пример – десериализацияМалък пример – десериализация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); }} }}}}

Малък пример – десериализацияМалък пример – десериализация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); }} }}}}

Малък пример – десериализацияМалък пример – десериализация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); }} }}}}

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

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

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

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

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

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

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

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

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

IDeserializationCallbackIDeserializationCallback

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) Забележка: НЗабележка: Не забравяйте конструкторае забравяйте конструктора, ,

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

Контролиране на сериализациятаКонтролиране на сериализацията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); }}}}

Контролиране на сериализациятаКонтролиране на сериализацията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); }}}}

Контролиране на сериализациятаКонтролиране на сериализацията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); }}}}

Контролиране на сериализациятаКонтролиране на сериализацията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); }}}}

Контролиране на сериализациятаКонтролиране на сериализацията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); }}}}

Контролиране на сериализациятаКонтролиране на сериализацията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); }}}}

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

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))

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

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

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

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

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

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

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

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

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

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

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

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

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); }}}}

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

Контролиране на изходния Контролиране на изходния 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;}}

Контролиране на изходния Контролиране на изходния 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;}}

Контролиране на изходния Контролиране на изходния 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;}}

Контролиране на изходния Контролиране на изходния 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;}}

Контролиране на изходния Контролиране на изходния 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;}}

Контролиране на изходния Контролиране на изходния 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;}}

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

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

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

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

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

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

Реализира се чрез класовете Реализира се чрез класовете 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);......

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

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

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

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

Приложение: Приложение: 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)

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

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

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

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

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

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

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

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

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

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

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/

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

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/

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

top related