Сериализацията е процесът на преобразуване на обект в линейна последователност на байта наречен "байт поток." Десериализацията просто обръща процеса. Но защо бихте искали да преобразувате обект в байтов поток?
Основната причина е, за да можете да местите обекта наоколо. Обмислете възможностите. Тъй като „всичко е обект“ в .NET, можете да сериализирате всичко и да го запишете във файл. Така че можете да сериализирате снимки, файлове с данни, текущото състояние на програмен модул („състояние“ е като a моментна снимка на програмата ви в даден момент, за да можете временно да спрете изпълнението и да започнете отново по късно)... каквото трябва да направите.
Можете също да съхранявате тези обекти на диска във файлове, да ги изпращате през мрежата, да ги предавате на различна програма, да съхранявате резервно копие за безопасност или сигурност. Възможностите са буквално безкрайни.
Ето защо сериализацията е толкова ключов процес в .NET и Visual Basic. По-долу е даден раздел за персонализирана сериализация чрез прилагане на
ISerializable интерфейс и кодиране a нов и a GetObjectDataподпрограма.Като първи пример за сериализация, нека направим една от най-лесните програми, но и една от най-полезните: сериализиране на данни и след това десериализиране на данни в прост клас до и от файл. В този пример данните са не само сериализирани, но и структурата на данните се записва. Структурата тук е декларирана в модул за запазване на нещата... добре... структурирана.
Модул SerializeParms
Public Parm1Name As String = "Име на Parm1"
Public Parm1Value като цяло число = 12345
Public Parm2Name като струнен
Публична Parm2Value като десетична
Краен клас
Краен модул
След това отделните стойности могат да бъдат записани във файл като този:
Система за внос. Runtime. Сериализирането. Форматиране. двоен
Система за внос. IO
Форма за публичен клас1
Частен Sub mySerialize_Click (_
ByVal подател като система. Обект, _
ByVal e като система. EventArgs) _
Дръжки mySerialize. Кликнете
Dim ParmData като нов ParmExample
ParmData. Parm2Name = "Име на Parm2"
ParmData. Parm2Value = 54321.12345
Dim s като нов FileStream ("ParmInfo", FileMode. Създаване)
Dim f като нов BinaryFormatter
е. Сериализиране (и, ParmData)
с. Близо()
Край Sub
Краен клас
И същите тези стойности могат да бъдат извлечени по този начин:
Система за внос. Runtime. Сериализирането. Форматиране. двоен
Система за внос. IO
Форма за публичен клас1
Частен Sub myDeserialize_Click (_
ByVal подател като система. Обект, _
ByVal e като система. EventArgs) _
Дръжки myDeserialize. Кликнете
Dim s = Нова FileStream („ParmInfo“, FileMode. Open)
Dim f като нов BinaryFormatter
Dim RestoredParms като нов ParmExample
ВъзстановениПарми = f. Десериализиране
с. Близо()
Console. WriteLine (ВъзстановениParms. Parm1Name)
Console. WriteLine (ВъзстановениParms. Parm1Value)
Console. WriteLine (ВъзстановениParms. Parm2Name)
Console. WriteLine (ВъзстановениParms. Parm2Value)
Край Sub
Краен клас
А структура или колекция (като например ArrayList), а не a клас може също да бъде сериализиран във файл по същия начин.
След като преминахме основния процес на сериализиране, нека разгледаме конкретните детайли, които са част от процеса на следващата страница.
Едно от първите неща, които трябва да забележите за този пример, е атрибут в клас. Атрибути са просто повече информация, която можете да предоставите на VB.NET за даден обект и те се използват за много различни неща. Атрибутът в този код казва на VB.NET да добави допълнителен код, за да може по-късно всичко в този клас да бъде сериализирано.
Ако в класа има конкретни елементи, които вие не искате да бъдете сериализирани, можете да използвате атрибут, за да ги изключите:
В примера забележете това издавам на части и десериализиране са методи на BinaryFormatter обект (е в този пример).
е. Сериализиране (и, ParmData)
Този обект приема FILESTREAM обект и обектът, който трябва да бъде сериализиран като параметри. Ще видим, че VB.NET предлага друг обект, който позволява резултата да се изрази като XML.
И една последна забележка, ако вашият обект включва други подчинени обекти, те също ще бъдат сериализирани! Но оттогава всичко обекти, които са сериализирани трябва да да бъдат маркирани с атрибут, всички тези дъщерни обекти също трябва да бъдат маркирани по този начин.
Само за да сте напълно ясни какво се случва във вашата програма, може да искате да покажете файла с име ParmData в Notepad, за да видите как изглеждат сериализираните данни. (Ако следвате този код, той трябва да бъде в Бин. Debug папка във вашия проект.) Тъй като това е двоичен файл, по-голямата част от съдържанието не е четим текст, но трябва да можете да виждате низове във вашия сериализиран файл. След това ще направим XML версия и може да искате да сравните двете, само за да сте наясно с разликата.
Сериализирането на XML вместо двоичен файл изисква много малко промени. XML не е толкова бърз и не може да улови някаква информация за обекта, но е далеч по-гъвкав. XML може да се използва от почти всяка друга софтуерна технология в света днес. Ако искате да сте сигурни, че файловите ви структури не ви „обвързват“ с Microsoft, това е добър вариант да разгледате. Microsoft набляга на „LINQ to XML“, за да създава XML файлове с данни в най-новата си технология, но много хора все още предпочитат този метод.
„X“ в XML означава eхопъващо. В нашия XML пример ще използваме едно от тези разширения на XML, технология, наречена SOAP. Това означаваше „Прост протокол за достъп до обект“, но сега е само име. (SOAP е подобрен толкова много, че оригиналното име вече не се вписва толкова добре.)
Основното, което трябва да променим в нашите подпрограми, е декларирането на форматиращия сериализатор. Това трябва да се промени както в подпрограмата, която сериализира обекта, така и в тази, която го десериализира отново. За конфигурацията по подразбиране това включва три промени във вашата програма. Първо, трябва да добавите Справка към проекта. Щракнете с десния бутон на мишката върху проекта и изберете Добавяне на референция .... Уверете се, че ...
Система. Runtime. Сериализирането. Форматиране. сапун
... е добавен към проекта.
След това променете двата отчета в програмата, която го препраща.
Система за внос. Runtime. Сериализирането. Форматиране. сапун
Dim f като нов SoapFormatter
Този път, ако проверите същото ParmData файл в Notepad, ще видите, че цялата работа е в четим XML текст като ...
Има и много допълнителни XML там, които са необходими и за стандарта SOAP във файла. Ако искате да проверите какво атрибут има, можете да добавите променлива с този атрибут и да погледнете файла, за да проверите дали не е включен.
Примерът, който току-що кодирахме, само сериализира данните, но да предположим, че трябва да контролирате как сериализират данните. VB.NET може и това!
За да постигнете това, трябва да се задълбочите малко в концепцията за сериализация. VB.NET има нов обект, който да ви помогне тук: SerializationInfo. Въпреки че имате възможност да кодирате персонализирано поведение на сериализация, това идва с разходи за допълнително кодиране.
Основното екстра код е показан по-долу. Не забравяйте, че този клас се използва вместо ParmExample клас, показан в по-ранния пример. Това не е пълен пример. Целта е да ви покажем новия код, който е необходим за персонализирана сериализация.
Система за внос. Runtime. сериализирането
Персонализиране на публичен клас
Изпълнява 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 = информация. GetString ( "а")
Parm1Value = информация. GetInt32 ( "В")
„Новата подсекция продължава ...
Кога десериализиране се извиква на a BinaryFormatter обект, този суб се изпълнява и a SerializationInfo обект се предава на нов подпрограма. След това New може да направи всичко необходимо със сериализираните стойности на данните. Например ...
MsgBox ("Това е Parm1Value Times Pi:" _
& (Parm1Value * Математика PI) .ToString)
Обратното се случва, когато издавам на части се нарича, но на BinaryFormatter обектни обаждания GetObjectData вместо.
Public Sub GetObjectData (_
Информация от ByVal Както SerializationInfo, _
ByVal контекст като StreamingContext) _
Изпълнява ISerializable. GetObjectData
'актуализира сериализирания магазин за данни
'от програмни променливи
Ако Parm2Name = "Тест" Тогава
инфо. AddValue ("a", "Това е тест.")
още
инфо. AddValue ("a", "Този път няма тест.")
Край Ако
инфо. AddValue ("b", 2)
Забележете, че данните се добавят към сериализирания файл като двойки име / стойност.
Много от уеб страниците, които открих при писането на тази статия, изглежда нямат действителен работен код. Човек се чуди дали авторът действително е изпълнил някакъв код, преди да напише статията понякога.