Живот

Всичко за сериализирането във Visual Basic

Всичко за сериализирането във Visual Basic

Сериализацията е процесът на преобразуване на обект в линейна последователност от байтове, наречена "байт поток". Десериализацията просто обръща процеса. Но защо бихте искали да преобразувате обект в байтов поток?

Основната причина е, за да можете да местите обекта наоколо. Обмислете възможностите. Тъй като „всичко е обект“ в .NET, можете да сериализирате всичко и да го запишете във файл. Така че можете да сериализирате снимки, файлове с данни, текущото състояние на програмен модул („състояние“ е моментна снимка на вашата програма в даден момент, за да можете временно да спрете изпълнението и да започнете отново по-късно)… каквото трябва да направите.

Можете също да съхранявате тези обекти на диска във файлове, да ги изпращате през мрежата, да ги предавате на различна програма, да съхранявате резервно копие за безопасност или сигурност. Възможностите са буквално безкрайни.

Ето защо сериализацията е толкова ключов процес в .NET и Visual Basic. По-долу е даден раздел за персонализирана сериализация чрез прилагане на ISerializable интерфейс и кодиране a нов и a GetObjectData подпрограма.

Като първи пример за сериализация, нека направим една от най-лесните програми, но и една от най-полезните: сериализиране на данни и след това десериализиране на данни в прост клас до и от файл. В този пример данните са не само сериализирани, но и структурата на данните се записва. Структурата тук е декларирана в модул, за да запази нещата ... добре ... структурирани.

Модул SerializeParms
ParmExample от публичен клас
Public Parm1Name As String = "Име на Parm1"
Public Parm1Value като цяло число = 12345
Public Parm2Name като струнен
Публична Parm2Value като десетична
Краен клас
Краен модул

След това отделните стойности могат да бъдат записани във файл като този:

Импортира System.Runtime.Serialization.Formatters.Binary
Импортира System.IO
Форма за публичен клас1
Частен Sub mySerialize_Click (_
ByVal подател като System.Object, _
ByVal e като System.EventArgs) _
Работи с mySerialize.Click
Dim ParmData като нов ParmExample
ParmData.Parm2Name = "Име на Parm2"
ParmData.Parm2Value = 54321.12345
Dim s като нова FileStream ("ParmInfo", FileMode.Create)
Dim f като нов BinaryFormatter
f.Сериализиране (s, ParmData)
s.Close ()
Край Sub
Краен клас

И същите тези стойности могат да бъдат извлечени така:

Импортира System.Runtime.Serialization.Formatters.Binary
Импортира System.IO
Форма за публичен клас1
Частен Sub myDeserialize_Click (_
ByVal подател като System.Object, _
ByVal e като System.EventArgs) _
Работи с myDeserialize.Click
Dim s = Нова FileStream ("ParmInfo", FileMode.Open)
Dim f като нов BinaryFormatter
Dim RestoredParms като нов ParmExample
RestoredParms = f.Deserialize (s)
s.Close ()
Console.WriteLine (RestoredParms.Parm1Name)
Console.WriteLine (RestoredParms.Parm1Value)
Console.WriteLine (RestoredParms.Parm2Name)
Console.WriteLine (RestoredParms.Parm2Value)
Край Sub
Краен клас

А структура или колекция (като например ArrayList), а не a клас може също да бъде сериализиран във файл по същия начин.

Сега, когато преминахме основния процес на сериализиране, нека разгледаме конкретните детайли, които са част от процеса на следващата страница.

Едно от първите неща, които трябва да забележите в този пример, е атрибут в клас, Атрибутите са просто повече информация, която можете да предоставите на VB.NET за обект и те се използват за много различни неща. Атрибутът в този код казва на VB.NET да добави допълнителен код, за да може по-късно всичко в този клас да бъде сериализирано.

Ако в класа има конкретни елементи, които вие не искате да бъдете сериализирани, можете да използвате атрибут, за да ги изключите:

Public Parm3Value As String = "Каквото и да е"

В примера забележете това издавам на части и десериализиране са методи на BinaryFormatter обект (е в този пример).

f.Сериализиране (s, ParmData)

Този обект приема FILESTREAM обект и обектът, който трябва да бъде сериализиран като параметри. Ще видим, че VB.NET предлага друг обект, който позволява резултата да се изрази като XML.

И една последна забележка, ако вашият обект включва други подчинени обекти, те също ще бъдат сериализирани! Но оттогава всичко обекти, които са сериализирани трябва да да бъдат маркирани с атрибут, всички тези дъщерни обекти също трябва да бъдат маркирани по този начин.

Само за да сте напълно ясни какво се случва във вашата програма, може да искате да покажете файла с име ParmData в Notepad, за да видите как изглеждат сериализираните данни. (Ако следвате този код, той трябва да бъде в bin.Debug папка във вашия проект.) Тъй като това е двоичен файл, по-голямата част от съдържанието не е четим текст, но трябва да можете да виждате низове във вашия сериализиран файл. След това ще направим XML версия и може да искате да сравните двете, само за да сте наясно с разликата.

Сериализирането на XML вместо двоичен файл изисква много малко промени. XML не е толкова бърз и не може да улови някаква информация за обекта, но е далеч по-гъвкав. XML може да се използва от почти всяка друга софтуерна технология в света днес. Ако искате да сте сигурни, че файловите ви структури не ви „обвързват“ с Microsoft, това е добър вариант да разгледате. Microsoft набляга на „LINQ to XML“, за да създава XML файлове с данни в най-новата си технология, но много хора все още предпочитат този метод.

"X" в XML означава eхопъващо. В нашия пример за XML ще използваме едно от тези разширения на XML, технология, наречена SOAP, Това означаваше "Прост протокол за достъп до обекти", но сега е само име. (SOAP е надстроен дотолкова, че оригиналното име вече не се вписва толкова добре.)

Основното, което трябва да променим в подпрограмите си, е декларирането на форматиращия сериализатор. Това трябва да се промени както в подпрограмата, която сериализира обекта, така и в тази, която го десериализира отново. За конфигурацията по подразбиране това включва три промени във вашата програма. Първо, трябва да добавите Справка към проекта. Щракнете с десния бутон върху проекта и изберете Добавяне на референция ... , Уверете се, че ...

System.Runtime.Serialization.Formatters.Soap

… Е добавен към проекта.

След това променете двата отчета в програмата, която го препраща.

Импортира System.Runtime.Serialization.Formatters.Soap
Dim f като нов SoapFormatter

Този път, ако проверите същото ParmData файл в Notepad, ще видите, че цялата работа е в четим XML текст като ...

Име на Parm1
12345
Име Parm2
54321.12345

Има и много допълнителни XML там, които са необходими и за стандарта SOAP във файла. Ако искате да проверите какво атрибут има, можете да добавите променлива с този атрибут и да погледнете файла, за да проверите дали не е включен.

Примерът, който току-що кодирахме, само сериализира данните, но да предположим, че трябва да контролирате как сериализират данните. VB.NET може и това!

За да постигнете това, трябва да се задълбочите малко в концепцията за сериализация. VB.NET има нов обект, който да ви помогне тук: SerializationInfo, Въпреки че имате възможност да кодирате персонализирано поведение на сериализация, това идва с разходи за допълнително кодиране.

Основното екстра код е показан по-долу. Не забравяйте, че този клас се използва вместо ParmExample клас, показан в по-ранния пример. Това не е пълен пример. Целта е да ви покажем новия код, който е необходим за персонализирана сериализация.

Импортира System.Runtime.Serialization
_
Персонализиране на публичен клас
Изпълнява ISerializable
„данните, които ще се сериализират тук
„Public SerializedVariable като тип
Обществен под нов ()
'конструктор по подразбиране, когато клас
'е създаден - персонализиран код може да бъде
'добавено и тук
Край Sub
Обществен под нов (_
Информация от ByVal като SerializationInfo, _
Контекст на ByVal като StreamingContext)
'инициализирайте променливите на вашата програма от
„сериализиран магазин за данни
Край Sub
Public Sub GetObjectData (_
Информация от ByVal като SerializationInfo, _
ByVal контекст като StreamingContext) _
Внедрява ISerializable.GetObjectData
'актуализира сериализирания магазин за данни
'от програмни променливи
Край Sub
Краен клас

Идеята е, че сега можете (и всъщност вие трябва да) направете всички актуализации и четене на данни в сериализирания магазин за данни в нов и GetObjectData подпрограми. Трябва да включите и родово нов конструктор (няма списък с параметри), защото прилагате интерфейс.

Класът обикновено ще има и кодирани формални свойства и методи ...

„Родова собственост
Частна новаPropertyValue като низ
Публична собственост NewProperty () като низ
получавам
Върнете новаPropertyValue
Край Вземете
Задаване (ByVal стойност като низ)
newPropertyValue = стойност
Краен комплект
Крайна собственост
„Генеричен метод
Публичен под MyMethod ()
'код на метода
Край Sub

Полученият сериализиран клас може да създаде уникални стойности във файла въз основа на предоставения от вас код. Например клас за недвижими имоти може да актуализира стойността и адреса на къщата, но класът също ще сериализира изчислена пазарна класификация.

Най- нов подпрограмата ще изглежда така:

Обществен под нов (_
Информация от ByVal като SerializationInfo, _
Контекст на ByVal като StreamingContext)
'инициализирайте променливите на вашата програма от
„сериализиран магазин за данни
Parm1Name = info.GetString ("a")
Parm1Value = info.GetInt32 ("b")
„Новата подсекция продължава ...

Кога десериализиране се извиква на a BinaryFormatter обект, този суб се изпълнява и a SerializationInfo обект се предава на нов подпрограма. След това New може да направи всичко необходимо със сериализираните стойности на данните. Например…

MsgBox ("Това е Parm1Value Times Pi:" _
& (Parm1Value * Math.PI) .ToString)

Обратното се случва, когато издавам на части се нарича, но на BinaryFormatter обектни обаждания GetObjectData вместо.

Public Sub GetObjectData (_
Информация от ByVal като SerializationInfo, _
ByVal контекст като StreamingContext) _
Внедрява ISerializable.GetObjectData
'актуализира сериализирания магазин за данни
'от програмни променливи
Ако Parm2Name = "Тест" Тогава
info.AddValue ("a", "Това е тест.")
още
info.AddValue ("a", "Този път няма тест.")
Край Ако
info.AddValue ("b", 2)

Забележете, че данните се добавят към сериализирания файл като двойки име / стойност.

Много от уеб страниците, които открих при писането на тази статия, изглежда нямат действителен работен код. Човек се чуди дали авторът действително е изпълнил някакъв код, преди да напише статията понякога.


Гледай видеото: Проверка на типовете обекти в ООП -- урок 14 (Юни 2021).