Све о сериализацији у Висуал Басиц

Серијализација је процес претварања објекта у линеарни низ од бајтова која се назива "бајт стреам". Десеријализација само преокреће процес. Али зашто бисте желели да претворите објект у ток бајтова?

Главни разлог је тај што можете померати предмет около. Размотрите могућности. Пошто је "све предмет" у .НЕТ-у, можете сериализовати било шта и сачувати га у датотеку. Тако бисте могли да сериализујете слике, датотеке са подацима, тренутно стање програмског модула („стање“ је као тренутни снимак вашег програма тако да можете привремено обуставити извршење и покренути поново касније)... шта год треба да урадите.

Ове објекте такође можете да похраните на диск у датотекама, пошаљете их преко интернета, проследите их у други програм, сачувате резервну копију ради сигурности или сигурности. Могућности су дословно бескрајне.

Зато је сериализација тако кључан процес у .НЕТ и Вижуал бејзик. Испод је одељак о прилагођеној сериализацији применом ИСериализабле интерфејс и кодирање а Нова и а ГетОбјецтДатапотпрограм.

instagram viewer

Као први пример сериализације направимо један од најлакших програма, али и један од најкориснијих: сериализација података, а затим десеријализација података у једноставној класи у датотеку и из ње. У овом примеру се подаци не само сериализују, већ се чува и структура података. Структура овде је декларисана у модулу да задржи ствари... добро... структурирано.

Модуле СериализеПармс
Јавна класа ПармЕкампле
Публиц Парм1Наме Ас Стринг = "Име Парм1"
Јавна парм1 вредност као цео број = 12345
Јавно парм2Наме као низ
Јавна Парм2Валуе као децимална
Енд Цласс
Крајњи модул

Потом се појединачне вредности могу сачувати у датотеку попут ове:

Систем увоза. Рунтиме. Серијализација. Форматтери. Бинарни
Систем увоза. ИО
Јавна класа Форм1
Привате Суб миСериализе_Цлицк (_
БиВал пошиљалац Ас Систем. Објекат, _
БиВал е као систем. ЕвентАргс) _
Рукује миСериализе. Кликните на
Дим ПармДата као нови ПармЕкампле
ПармДата. Парм2Наме = "Име Парм2"
ПармДата. Парм2Валуе = 54321.12345
Дим с Нев ФилеСтреам ("ПармИнфо", ФилеМоде. Креирај)
Дим ф као нови БинариФорматтер
ф. Серијализовати (с, ПармДата)
с. Близу()
Енд Суб
Енд Цласс

И исте те вредности могу се пронаћи овако:

Систем увоза. Рунтиме. Серијализација. Форматтери. Бинарни
Систем увоза. ИО
Јавна класа Форм1
Привате Суб миДесериализе_Цлицк (_
БиВал пошиљалац Ас Систем. Објекат, _
БиВал е као систем. ЕвентАргс) _
Рукује миДесериализе. Кликните на
Дим с = Нова ФилеСтреам ("ПармИнфо", ФилеМоде. Отвори)
Дим ф као нови БинариФорматтер
Дим РесторедПармс као нови пармЕкампле
РесторедПармс = ф. Десериализе (с)
с. Близу()
Конзола. ВритеЛине (РестореПармс). Парм1Наме)
Конзола. ВритеЛине (РестореПармс). Парм1Валуе)
Конзола. ВритеЛине (РестореПармс). Парм2Наме)
Конзола. ВритеЛине (РестореПармс). Парм2Валуе)
Енд Суб
Енд Цласс

А Структура или колекцију (као што је ан Низ листа) а не Класа такође се сериализовати у датотеку на исти начин.

Сада када смо прошли кроз основни процес сериализације, погледајмо специфичне детаље који су део процеса на следећој страници.

Једна од првих ствари које бисте требали приметити на овом примеру је атрибут у Класа. Атрибути само су више информација које можете да дате ВБ.НЕТ-у о неком објекту и они се користе за много различитих ствари. Атрибут у овом коду говори ВБ.НЕТ-у да дода додатни код како би се касније све у овој класи могло сериализовати.

Ако у Класи постоје одређене ставке које ви немој Ако желите да будете сериализовани, можете да користите атрибут да их искључите:

Публиц Парм3Валуе Ас Стринг = "Шта год"

У примеру, примети то Серијализовати и Десериализирати су методе БинариФорматтер објект (ф у овом примеру).

ф. Серијализовати (с, ПармДата)

Овај објект узима ФилеСтреам објекта и објекта који се мора сериализовати као параметри. Видећемо да ВБ.НЕТ нуди још један објект који омогућава да се резултат изрази као КСМЛ.

И последња напомена, ако ваш објекат укључује и друге подређене објекте, они ће бити сериализовани! Али како све предмети који су сериализовани мора бити обележен са атрибут, сви ти подређени објекти морају бити означени и на тај начин.

Да бисте били потпуно јасни у ономе што се догађа у вашем програму, можда бисте желели да прикажете датотеку под називом ПармДата у Нотепад-у да бисте видели како изгледају сериализовани подаци. (Ако сте пратили овај код, требало би да буде у канта за смеће Дебуг мапе у вашем пројекту.) Будући да је ово бинарна датотека, већина садржаја није читљив текст, али требали бисте бити у могућности да видите било какве низове у сериализираној датотеци. Следеће ћемо урадити КСМЛ верзију и можда ћете желети да упоредите две само да бисте били свесни разлике.

Серијализација у КСМЛ уместо бинарне датотеке захтева веома мало промена. КСМЛ није тако брз и не може ухватити неке информације о објектима, али је далеко флексибилнији. КСМЛ данас може користити скоро свака друга софтверска технологија у свету. Ако желите да будете сигурни да вас датотеке датотека не "везују" за Мицрософт, ово је добра опција која треба да размотрите. Мицрософт наглашава "ЛИНК то КСМЛ" да би створио КСМЛ датотеке података по својој најновијој технологији, али многи људи и даље преферирају овај метод.

"Кс" у КСМЛ означава еИксзатегнуто. У нашем примеру КСМЛ користићемо једно од тих проширења КСМЛ-а, технологије која се зове СОАП. Некада је то значило "Симпле Објецт Аццесс Протоцол", али сада је то само име. (СОАП је толико надограђен да му оригинално име више не одговара.)

Главна ствар коју морамо променити у нашим подпрограмима је декларација формата сериализације. Ово се мора променити и у подпрограму који серијски врши предмет, и у оном који га поново десеријализује. За подразумевану конфигурацију то укључује три промене вашег програма. Прво, пројекту морате додати референцу. Кликните десним тастером миша на пројекат и изаберите Додај референцу .... Буди сигуран ...

Систем. Рунтиме. Серијализација. Форматтери. Сапун

... је додан у пројекат.

Затим промените две изјаве у програму који га референцира.

Систем увоза. Рунтиме. Серијализација. Форматтери. Сапун
Дим ф као нови СоапФорматтер

Овај пут ако проверите исто ПармДата Датотеке у Нотепад-у, видећете да је цела ствар у читљивом КСМЛ тексту, попут ...

Назив Парм1
12345
Име Парм2
54321.12345

Ту је и пуно додатних КСМЛ-а који су потребни и за СОАП стандард у датотеци. Ако желите да проверите шта атрибут има, можете додати променљиву са тим атрибутом и погледати датотеку да бисте утврдили да није укључена.

Пример који смо управо кодирали само је серијски податке, али претпоставимо да морате да контролишете како се подаци сериализују. ВБ.НЕТ могу и то!

Да бисте то постигли, потребно је да се мало дубље позабавите концептом сериализације. ВБ.НЕТ има нови објекат који ће вам помоћи овде: СериализатионИнфо. Иако имате могућност кодирања понашања прилагођене сериализације, то кошта и додатно кодирање.

Основна ектра Код је приказан испод. Запамтите, ова класа се користи уместо ПармЕкампле класа приказана у претходном примеру. Ово није комплетан пример. Сврха је да вам покаже нови код који је потребан за прилагођену сериализацију.

Систем увоза. Рунтиме. Серијализација
_
Прилагођавање јавних класа
Имплементира ИСериализабле
'подаци се овде сериализирају
'Публиц СериализедВариабле ас Типе
Публиц Суб Нев ()
'подразумевани конструктор када је класа
'је креиран - прилагођени код може бити
'такође додато овде
Енд Суб
Публиц Суб Нев (_
Информације о БиВал-у Ас СериализатионИнфо, _
БиВал контекст као СтреамингЦонтект)
'иницијализирајте своје променљиве програма из
'сериализована продавница података
Енд Суб
Јавни под ГетОбјецтДата (_
Информације о БиВал-у Ас СериализатионИнфо, _
БиВал контекст као СтреамингЦонтект) _
Имплементира ИСериализабле. ГетОбјецтДата
'ажурирајте сериализовану складиште података
'од програмских варијабли
Енд Суб
Енд Цласс

Идеја је да сад то можете (а у ствари и ви) мора) обавите све ажурирање и читање података у сериализованој складишту података у Нова и ГетОбјецтДата суброутинес. Морате укључити и генеричко Нова конструктор (без листе параметара) јер имплементирате интерфејс.

Класа ће обично имати и формална својства и методе кодиране ...

'Генериц Проперти
Приватна новаПропертиВалуе Ас Стринг
Нова имовина НевПроперти () као низ
Добити
Врати новуПропертиВалуе
Енд Гет
Подеси (БиВал вредност као низ)
невПропертиВалуе = вредност
Енд Сет
Енд Проперти
'Генериц Метход
Јавни под МиМетход ()
'код код метода
Енд Суб

Резултирајућа сериализована класа може створити јединствене вредности у датотеци на основу кода који добављате. На пример, класа некретнина може да ажурира вредност и адресу куће, али ће класа серијски користити и израчунату тржишну класификацију.

Тхе Нова подпрограм ће изгледати овако:

Публиц Суб Нев (_
Информације о БиВал-у Ас СериализатионИнфо, _
БиВал контекст као СтреамингЦонтект)
'иницијализирајте своје променљиве програма из
'сериализована продавница података
Парм1Наме = инфо. ГетСтринг ("а")
Парм1Валуе = информације. ГетИнт32 ("б")
'Нова подстава се наставља ...

Када Десериализирати се зове а БинариФорматтер објекта, извршава се овај под и а СериализатионИнфо објект се просљеђује Нова потпрограм. Нови тада могу да ураде све што је потребно са сериализованим вредностима података. На пример ...

МсгБок ("Ово је Парм1Валуе Тимес Пи:" _
& (Парм1Валуе * Матх) ПИ) .ТоСтринг)

Обрнуто се дешава када Серијализовати се зове, али је БинариФорматтер објектни позиви ГетОбјецтДата уместо тога.

Јавни под ГетОбјецтДата (_
Информације о БиВал-у Ас СериализатионИнфо, _
БиВал контекст као СтреамингЦонтект) _
Имплементира ИСериализабле. ГетОбјецтДата
'ажурирајте сериализовану складиште података
'од програмских варијабли
Ако је Парм2Наме = "Тест" онда
инфо. АддВалуе ("а", "Ово је тест.")
Остало
инфо. АддВалуе ("а", "Нема тестирања овог пута.")
Енд Иф
инфо. АддВалуе ("б", 2)

Примјетите да су подаци додани у сериализирану датотеку као парови имена / вриједности.

Много веб страница које сам пронашао у писању овог чланка изгледа да немају стварни радни код. Пита се да ли је аутор заправо покренуо било који код пре него што је понекад написао чланак.

instagram story viewer