Serializavimas yra objekto pavertimo linijine seka procesas baitų vadinamas „baitų srautu“. Deserializacija tiesiog panaikina procesą. Bet kodėl jūs norite konvertuoti objektą į baitų srautą?
Pagrindinė priežastis yra ta, kad jūs galite perkelti objektą. Apsvarstykite galimybes. Kadangi .NET tinkle „viskas yra objektas“, galite bet ką nuosekliai sujungti ir išsaugoti faile. Taigi galėtumėte nuosekliau išdėstyti paveikslėlius, duomenų failus, dabartinę programos modulio būseną ('būsena' yra tokia kaip programos momentinis vaizdas tam tikru momentu, kad galėtumėte laikinai sustabdyti vykdymą ir pradėti iš naujo vėliau)... ką tau reikia padaryti.
Šiuos objektus taip pat galite laikyti diske failuose, siųsti juos per internetą, perduoti kitai programai, saugoti atsarginę kopiją saugai užtikrinti. Šios galimybės tiesiogine prasme yra begalinės.
Štai kodėl serijavimas yra toks pagrindinis procesas .NET ir Visual Basic. Žemiau yra skyrius apie pasirinktinį nuoseklumą, įgyvendinant ISerializuojamas sąsaja ir kodavimas a Nauja ir a „GetObjectData“paprogramė.
Kaip pirmąjį nuoseklumo pavyzdį darykime vieną iš paprasčiausių programų, tačiau taip pat ir naudingiausią: nuosekliai išdėstykite duomenis ir tada naudokite paprastos klasės duomenų padalijimą į failą ir iš jo. Šiame pavyzdyje duomenys ne tik serijuojami, bet ir išsaugoma duomenų struktūra. Čia esanti struktūra yra deklaruojama kaip modulis, skirtas daiktams laikyti... Na... struktūrizuotas.
Modulis „SerializeParms“
Viešas „Parm1Name As String“ = „Parm1 vardas“
Vieša „Parm1Value“ kaip sveikasis skaičius = 12345
Visuomenės „Parm2Name“ kaip eilutė
„Parm2Value“ kaip dešimtainė
Pabaigos klasė
Pabaigos modulis
Tada atskiras reikšmes galima išsaugoti tokiame faile:
Importo sistema. Klaida. Serializacija. Formatuotojai. Dvejetainis
Importo sistema. IO
1 klasės klasė
Privatus antrinis „mySerialize_Click“ (_
„ByVal“ siuntėjas kaip sistema. Objektas, _
„ByVal e As“ sistema. „EventArgs“ _
Tvarko „mySerialize“. Spustelėkite
Dim ParmData kaip naujas ParmExample
„ParmData“. Parm2Name = "Parm2 pavadinimas"
„ParmData“. „Parm2Value“ = 54321.12345
Dim s kaip nauja „FileStream“ („ParmInfo“, „FileMode“. Sukurti)
„Dim f“ kaip naujas „BinaryFormatter“
f. Serializuoti (-us), „ParmData“
s. Uždaryti()
Pabaigos poskyris
Pabaigos klasė
Tos pačios vertės gali būti gaunamos taip:
Importo sistema. Klaida. Serializacija. Formatuotojai. Dvejetainis
Importo sistema. IO
1 klasės klasė
Privatus antrinis „myDeserialize_Click“ (_
„ByVal“ siuntėjas kaip sistema. Objektas, _
„ByVal e As“ sistema. „EventArgs“ _
Tvarko „myDeserialize“. Spustelėkite
Dim s = Nauja „FileStream“ („ParmInfo“, „FileMode“. Atviras)
„Dim f“ kaip naujas „BinaryFormatter“
Dim RestoredParms as New ParmExample
RestoredParms = f. Deserialize (-ai)
s. Uždaryti()
Konsolė. „WriteLine“ („Restauruotos prekės“. „Parm1Name“)
Konsolė. „WriteLine“ („Restauruotos prekės“. „Parm1Value“)
Konsolė. „WriteLine“ („Restauruotos prekės“. „Parm2Name“)
Konsolė. „WriteLine“ („Restauruotos prekės“. „Parm2Value“)
Pabaigos poskyris
Pabaigos klasė
A Struktūra arba kolekcija (pvz., „ArrayList“), o ne Klasė taip pat galėtų būti susietas su byla.
Dabar, kai jau perėjome prie pagrindinio nuoseklumo sudarymo proceso, galime kitame puslapyje pažvelgti į konkrečią informaciją, kuri yra proceso dalis.
Vienas iš pirmųjų dalykų, kurį turėtumėte pastebėti šiame pavyzdyje, yra atributas Klasė. Atributai yra tik daugiau informacijos, kurią galite pateikti VB.NET apie objektą, ir jie naudojami daugybei skirtingų dalykų. Šio kodo atributas liepia VB.NET pridėti papildomą kodą, kad vėliau viskas šioje klasėje galėtų būti susisteminta.
Jei klasėje yra tam tikrų daiktų, kuriuos jūs nereikia norite būti serijinis, galite naudoti atributas, kad juos neįtrauktų:
Pavyzdyje atkreipkite dėmesį, kad Serializuoti ir Deserializuoti yra metodai „BinaryFormatter“ objektas (f šiame pavyzdyje).
f. Serializuoti (-us), „ParmData“
Šis objektas užima „FileStream“ objektas ir serijinis objektas kaip parametrai. Pamatysime, kad VB.NET siūlo kitą objektą, kuris leidžia rezultatą išreikšti kaip XML.
Ir paskutinė pastaba: jei jūsų objekte yra kiti pavaldūs objektai, jie taip pat bus serijiniai! Bet nuo to laiko visi objektai, kurie yra serijiniai privalo būti pažymėtas atributas, visi šie antriniai objektai taip pat turi būti pažymėti.
Norėdami būti visiškai aiškūs apie tai, kas vyksta jūsų programoje, galbūt norėsite parodyti failą pavadinimu „ParmData“ „Notepad“, kad pamatytumėte, kaip atrodo nuoseklieji duomenys. (Jei sekėte šį kodą, jis turėtų būti šiukšliadėžę. Derinti aplanką savo projekte.) Kadangi tai yra dvejetainis failas, didžioji jo turinio dalis nėra skaitoma, tačiau turėtumėte pamatyti visas nuosekliojo failo eilutes. Vėliau atliksime XML versiją ir galbūt norėsite palyginti abi, kad žinotumėte apie skirtumą.
Serializavimas į XML, o ne į dvejetainį failą, reikalauja labai nedaug pakeitimų. XML nėra toks greitas ir negali užfiksuoti tam tikros informacijos apie objektus, tačiau jis yra daug lankstesnis. XML gali naudoti beveik visos kitos šiuolaikinės programinės įrangos technologijos. Jei norite būti tikri, kad jūsų failų struktūros „neprisiriša“ prie „Microsoft“, tai yra geras pasirinkimas. „Microsoft“ pabrėžia „LINQ to XML“, kad sukurtų XML duomenų failus pagal naujausias technologijas, tačiau daugelis žmonių vis tiek renkasi šį metodą.
„X“ in XML reiškia eXįmanomas. Mūsų XML pavyzdyje naudosime vieną iš tų XML plėtinių, vadinamą technologija SOAP. Anksčiau tai reiškė „paprastą objekto prieigos protokolą“, bet dabar tai tik vardas. (SOAP buvo patobulintas tiek, kad originalus pavadinimas jau nebetelpa.)
Pagrindinis dalykas, kurį turime pakeisti savo paprogramėse, yra serializatoriaus formatuotojo decliacija. Tai turi būti pakeista tiek paprogramėje, kuri serijuoja objektą, tiek ta, kuri jį vėl vertina. Numatytosios konfigūracijos atveju tai apima tris programos pakeitimus. Pirmiausia turite pridėti projekto nuorodą. Dešiniuoju pelės mygtuku spustelėkite projektą ir pasirinkite Pridėti nuorodą .... Įsitikinkite ...
Sistema. Klaida. Serializacija. Formatuotojai. Muilas
... buvo įtrauktas į projektą.
Tada pakeiskite du teiginius programoje, kurioje tai nurodoma.
Importo sistema. Klaida. Serializacija. Formatuotojai. Muilas
„Dim f“ kaip naujas „SoapFormatter“
Šį kartą, jei patikrinsite tą patį „ParmData“ failą „Notepad“, pamatysite, kad visa tai yra skaitomame XML tekste, tokiame kaip ...
Taip pat yra daugybė papildomų XML failų, reikalingų SOAP standartui. Jei norite patikrinti, ką atributas nėra, galite pridėti kintamąjį su tuo atributu ir pažiūrėję į failą įsitikinkite, kad jis neįtrauktas.
Pavyzdys, kurį mes ką tik kodifikavome, tik paeiliui sukūrė duomenis, tačiau tarkime, kad turite valdyti, kaip duomenys yra seriuojami. VB.NET gali padaryti ir tai!
Norėdami tai įvykdyti, turite šiek tiek įsigilinti į serializacijos koncepciją. Čia VB.NET turi naują objektą, kuris padės: SerializationInfo. Nors jūs turite galimybę užkoduoti individualizuotą serializacinę elgseną, ji kainuoja už papildomą kodavimą.
Pagrindinis papildoma kodas parodytas žemiau. Atminkite, kad ši klasė naudojama vietoj „ParmExample“ klasė, parodyta ankstesniame pavyzdyje. Tai nėra išsamus pavyzdys. Tikslas yra parodyti jums naują kodą, reikalingą pasirinktinei serializacijai.
Importo sistema. Klaida. Serializacija
Viešosios klasės „CustomSerialization“
Įdiegia ISerializuojamą
'duomenys turi būti surinkti čia
„Visuomenės atliekama serija, keičiama kaip rūšis
Nauja vieša dalis ()
numatytasis konstruktorius, kai klasė
'yra sukurtas - pasirinktinis kodas gali būti
pridėta ir čia
Pabaigos poskyris
Nauja vieša dalis (_
„ByVal“ informacija, kaip „SerializationInfo“, _
„ByVal“ kontekstas kaip „StreamingContext“)
inicializuokite savo programos kintamuosius iš
„nuosekli duomenų saugykla
Pabaigos poskyris
Viešas antrinis „GetObjectData“ (_
„ByVal“ informacija, kaip „SerializationInfo“, _
„ByVal“ kontekstas kaip „StreamingContext“ _
Įdiegia ISerializuojamą. „GetObjectData“
atnaujinti nuoseklųjį duomenų saugyklą
'iš programos kintamųjų
Pabaigos poskyris
Pabaigos klasė
Idėja yra ta, kad dabar jūs galite (ir, tiesą sakant, jūs privalo) atnaujinti ir nuskaityti duomenis nuosekliojoje duomenų saugykloje Nauja ir „GetObjectData“ paprogramės. Jūs taip pat turite įtraukti generinį vaistą Nauja konstruktorius (nėra parametrų sąrašo), nes diegiate sąsają.
Klasė paprastai turės oficialias savybes ir metodus, taip pat koduojamus ...
„Bendroji nuosavybė
Privatus newPropertyValue As String
Viešoji nuosavybė „NewProperty“ () kaip eilutė
Gaukite
Grąžinti „newPropertyValue“
Pabaiga gauti
Nustatyti („ByVal“ vertė kaip eilutė)
newPropertyValue = vertė
Pabaigos rinkinys
Pabaigos nuosavybė
„Bendrasis metodas
Viešas antrinis metodas ()
'metodo kodas
Pabaigos poskyris
Gauta nuosekli klasė gali sukurti unikalias reikšmes faile, remiantis jūsų pateiktu kodu. Pvz., Nekilnojamojo turto klasė gali atnaujinti namo vertę ir adresą, tačiau klasė taip pat atkartos apskaičiuotą rinkos klasifikaciją.
Nauja paprogramė atrodys maždaug taip:
Nauja vieša dalis (_
„ByVal“ informacija, kaip „SerializationInfo“, _
„ByVal“ kontekstas kaip „StreamingContext“)
inicializuokite savo programos kintamuosius iš
„nuosekli duomenų saugykla
„Parm1Name“ = informacija. „GetString“ („a“)
„Parm1Value“ = informacija. „GetInt32“ („b“)
„Nauja dalis tęsiama ...
Kada Deserializuoti yra pašauktas a „BinaryFormatter“ objektas, šis poskyris vykdomas ir a SerializationInfo objektas perduodamas Nauja paprogramė. Tuomet naujasis gali padaryti viską, kas būtina, atsižvelgiant į nuosekliųjų duomenų vertes. Pavyzdžiui ...
„MsgBox“ („Tai yra„ Parm1Value Times “Pi:“ _
& („Parm1Value“ * Matematika. PI) .ToString)
Atvirkščiai atsitinka, kai Serializuoti yra vadinamas, bet „BinaryFormatter“ objektų skambučiai „GetObjectData“ vietoj to.
Viešas antrinis „GetObjectData“ (_
„ByVal“ informacija, kaip „SerializationInfo“, _
„ByVal“ kontekstas kaip „StreamingContext“ _
Įdiegia ISerializuojamą. „GetObjectData“
atnaujinti nuoseklųjį duomenų saugyklą
'iš programos kintamųjų
Jei Parm2Name = "Test", tada
informacija. „AddValue“ („a“, „Tai yra testas“)
Kitas
informacija. „AddValue“ („a“, „Šį kartą testas netaikomas“)
Pabaiga Jei
informacija. „AddValue“ („b“, 2)
Atminkite, kad duomenys pridedami prie nuosekliojo failo kaip vardų / reikšmių poros.
Atrodo, kad daugybė tinklalapių, kuriuos radau rašant šį straipsnį, neturi tikrojo kodo. Kyla klausimas, ar autorius iš tikrųjų įvykdė kokį nors kodą prieš kartais rašydamas straipsnį.