Kõik Visual Basicu sarjastamise kohta

Serialiseerimine on objekti teisendamine lineaarseks jadaks baiti mida nimetatakse "baidivooluks". Deserialiseerimine lihtsalt pöörab protsessi ümber. Kuid miks soovite objekti teisendada baidivooluks?

Peamine põhjus on see, et saaksite objekti ringi liigutada. Mõelge võimalustele. Kuna .NET-is "kõik on objekt", saate kõike seerialiseerida ja faili salvestada. Nii et saaksite pilte, andmefaile seeriastada, moodulite praegune olek ('olek' on nagu a programmi hetktõmmis, et saaksite täitmise ajutiselt peatada ja uuesti alustada hiljem)... mida iganes sa tegema pead.

Samuti saate neid objekte kettale failidesse salvestada, saata neid veebi kaudu, edastada mõnele teisele programmile, hoida turvalisuse või turvalisuse tagamiseks varukoopiat. Võimalused on sõna otseses mõttes lõputud.

Sellepärast on serialiseerimine nii oluline protsess NET-is ja Visual Basic. Allpool on jaotis kohandatud seeriate seadistamise kohta ISerialiseeritav liides ja kodeerimine a Uus ja a GetObjectDataalamprogramm.

Esimese sarjastamise näitena teeme ühe lihtsama, aga ka ühe kõige kasuliku programmi: seeriate seeriad ja seejärel lihtsas klassis olevate andmete failideks vormistamine. Selles näites andmeid mitte ainult serialiseeritakse, vaid salvestatakse ka andmete struktuur. Siinne struktuur on deklareeritud moodulis asjade hoidmiseks... noh... struktureeritud.

instagram viewer

Moodul SerializeParms
Avalik klass ParmExample
Avalik Parm1Name kui string = "Parm1 nimi"
Avalik Parm1Value kui täisarv = 12345
Avalik Parm2Name kui keelpill
Avalik Parm2Value kui kümnendkoht
Lõpuklass
Lõppmoodul

Seejärel saab üksikud väärtused faili salvestada järgmiselt:

Impordi süsteem. Kestus. Serialiseerimine. Vormindajad. Binaarne
Impordi süsteem. IO
Avaliku klassi vorm1
Privaatne alamSerialize_Click (_
ByVal saatja kui süsteem. Objekt, _
ByVal e As süsteem. EventArgs) _
Käsitseb mySerialize'i. Klõpsake nuppu
Dim ParmData kui uus ParmExample
ParmData. Parm2Name = "Parm2 nimi"
ParmData. Parm2Value = 54321.12345
Dim on uue failivooluna ("ParmInfo", FileMode. Loo)
Dim f Nagu uus binaarvorming
f. Serialiseeri (id), ParmData
s. Sulge()
Lõpu alam
Lõpuklass

Ja samu väärtusi saab hankida järgmiselt:

Impordi süsteem. Kestus. Serialiseerimine. Vormindajad. Binaarne
Impordi süsteem. IO
Avaliku klassi vorm1
Privaatne alamDeserialize_Click (_
ByVal saatja kui süsteem. Objekt, _
ByVal e As süsteem. EventArgs) _
Käsitseb myDeserialize'i. Klõpsake nuppu
Dim s = Uus FileStream ("ParmInfo", FileMode. Avatud)
Dim f Nagu uus binaarvorming
Dim RestoredParms Nagu uus ParmExample
RestoredParms = f. Deserialize (id)
s. Sulge()
Konsool. WriteLine (taastatud pargid. Parm1Name)
Konsool. WriteLine (taastatud pargid. Parm1Value)
Konsool. WriteLine (taastatud pargid. Parm2Name)
Konsool. WriteLine (taastatud pargid. Parm2Value)
Lõpu alam
Lõpuklass

A Struktuur või kollektsiooni (näiteks ArrayList), mitte a Klass saab samamoodi failideks seeriastada.

Nüüd, kui oleme üle käinud põhilise serialiseerimisprotsessi, laseme järgmisel leheküljel vaadata konkreetseid üksikasju, mis on protsessi osa.

Üks esimesi asju, mida peaksite selle näite juures tähele panema, on atribuut Klass. Atribuudid on lihtsalt rohkem teavet, mille saate VB.NET-ile objekti kohta anda ja neid kasutatakse paljude erinevate asjade jaoks. Selle koodi atribuut käsib VB.NET-il lisada lisakoodi, nii et hiljem saaks kõike selle klassi seeriaid seada.

Kui klassis on konkreetseid esemeid, mida te ära tee Kui soovite seeriat, saate kasutada atribuut nende välistamiseks:

Avalik Parm3Value kui string = "mida iganes"

Näites on tähele pandud seda Serialiseeri ja Deserialiseeri on meetodid BinaryFormatter objekt (f selles näites).

f. Serialiseeri (id), ParmData

See objekt võtab FileStream objekt ja seeria objekt objektina. Näeme, et VB.NET pakub veel ühte objekti, mis võimaldab tulemust väljendada XML-na.

Ja viimane märkus: kui teie objekt sisaldab ka teisi alluvaid objekte, siis ka neid seerialiseeritakse! Aga kuna kõik objektid, mis on serialiseeritud peab olema tähistatud tähega atribuuti, tuleb ka kõik need alamobjektid nii märgistada.

Kui soovite oma programmis toimuva kohta täielikult aru saada, võiksite kuvada faili nimega ParmData Notepadis, et näha, kuidas sariväljastatud andmed välja näevad. (Kui järgisite seda koodi, peaks see olema kaustas prügikasti. Silumine kuna see on binaarfail, ei ole suurem osa sisust loetav tekst, kuid peaksite nägema kõiki seeriaviisilise faili stringe. Järgmisena teeme XML-versiooni ja võiksite neid kahte võrrelda, lihtsalt selleks, et erinevusest teada saada.

Binaarfaili asemel XML-vormingusse seadistamine nõuab väga vähe muudatusi. XML pole nii kiire ega suuda objektide kohta teavet hõivata, kuid on palju paindlikum. XML-i saab kasutada peaaegu iga teine ​​tänases maailmas olev tarkvaratehnoloogia. Kui soovite olla kindel, et teie failistruktuurid ei sidu teid Microsoftiga, on see hea võimalus uurida. Microsoft rõhutab "LINQ to XML" -i, et luua XML-andmefaile oma uusimas tehnoloogias, kuid paljud inimesed eelistavad seda meetodit endiselt.

"X" sisse XML tähistab eXmõistlik. Meie XML-näites hakkame kasutama ühte neist XML-i laienditest, tehnoloogiat nimega SEEP. Varem tähendas see "lihtsat objekti juurdepääsu protokolli", kuid nüüd on see lihtsalt nimi. (SOAP on nii palju täiustatud, et algne nimi ei kõlba enam nii hästi.)

Peamine asi, mida peame oma alamprogrammides muutma, on serialiseerimisvormingu declateerimine. Seda tuleb muuta nii alamprogrammis, mis objekti sarjastab, kui ka selles, mis väärib seda uuesti. Vaikekonfiguratsiooni puhul hõlmab see teie programmi kolme muudatust. Esiteks peate projekti juurde lisama viite. Paremklõpsake projekti ja valige Lisa viide .... Tee kindlaks ...

Süsteem. Kestus. Serialiseerimine. Vormindajad. Seep

... on projekti lisatud.

Seejärel muutke programmis kahte avaldust, mis sellele viitab.

Impordi süsteem. Kestus. Serialiseerimine. Vormindajad. Seep
Dim f Nagu uus SoapFormatter

Seekord, kui vaatate sama ParmData faili Notepadis, näete, et kogu asi on loetav XML-tekst, näiteks ...

Parm1 nimi
12345
Parm2 nimi
54321.12345

Seal on ka palju täiendavat XML-i, mis on vajalik ka failis oleva SOAP-standardi jaoks. Kui soovite kontrollida, mida Kui atribuut seda teeb, saate selle atribuudiga lisada muutuja ja vaadata faili, et kontrollida, kas see pole lisatud.

Näide, mille me just kodeerisime, ainult serialiseeris andmed, kuid oletame, et peate kontrollima, kuidas andmeid serialiseeritakse. VB.NET saab ka seda teha!

Selle saavutamiseks peate pisut põhjalikumalt tutvuma serialiseerimise mõistega. VB.NET-il on siin uus objekt, mida saab aidata: SerializationInfo. Ehkki teil on võimalus kohandatud seeriaviisilist käitumist kodeerida, kaasneb sellega lisakoodeerimise hind.

Põhiline Lisa kood on näidatud allpool. Pidage meeles, et seda klassi kasutatakse klassi asemel ParmExample klass, mida on näidatud varasemas näites. See pole täielik näide. Selle eesmärk on näidata teile uut koodi, mida on vaja kohandatud seerialiseerimiseks.

Impordi süsteem. Kestus. Serialiseerimine
_
Avaliku klassi kohandatud seerialiseerimine
Rakendab ISerialiseeritavat
'siin seerialiseeritavad andmed
'Avalik seeriaviisiliselt muudetav tüüp
Avalik alam uus ()
'vaikekonstruktor, kui klass
'on loodud - kohandatud kood võib olla
'lisatud ka siia
Lõpu alam
Avalik alam uus (_
ByVal teave kui SerializationInfo, _
ByVal-kontekst nagu StreamingContext)
"lähtestage programmi muutujad alates
'jadapõhine andmehoidla
Lõpu alam
Avalik alam GetObjectData (_
ByVal teave kui SerializationInfo, _
ByVal kontekst kui StreamingContext) _
Rakendab ISerialiseeritavat. GetObjectData
värskendage seerialiseeritud andmepoodi
'programmi muutujatest
Lõpu alam
Lõpuklass

Mõte on selles, et nüüd saate (ja tegelikult ka sina) peab) teha kõiki andmeid ajakohastatud ja loetud andmebaasis Uus ja GetObjectData alamprogrammid. Peate lisama ka geneerilise Uus konstruktor (parameetrite loendit pole), kuna rakendate liidest.

Klassil on tavaliselt formaalsed omadused ja ka kodeeritud meetodid ...

'Üldine vara
Privaatne newPropertyValue kui string
Avalik omand NewProperty () kui keelpill
Saage
Tagastab newPropertyValue
Lõpp saada
Määra (ByVal väärtus kui string)
newPropertyValue = väärtus
End Set
Lõppomand
'Üldine meetod
Avalik alammetoodika ()
'meetodi kood
Lõpu alam

Saadud serialiseeritud klass võib teie sisestatud koodi põhjal luua failis ainulaadseid väärtusi. Näiteks võib kinnisvaraklass ajakohastada maja väärtust ja aadressi, kuid klass klassifitseerib ka arvutatud turuklassifikatsiooni.

Uus alamprogramm näeb välja umbes selline:

Avalik alam uus (_
ByVal teave kui SerializationInfo, _
ByVal-kontekst nagu StreamingContext)
"lähtestage programmi muutujad alates
'jadapõhine andmehoidla
Parm1Name = teave. GetString ("a")
Parm1Value = teave. GetInt32 ("b")
'Uus alamosa jätkub ...

Millal Deserialiseeri kutsutakse a BinaryFormatter objekt, see alam käivitatakse ja a SerializationInfo objekt antakse edasi Uus alamprogramm. Uus saab siis teha serialiseeritud andmeväärtustega kõik, mis on vajalik. Näiteks ...

MsgBox ("See on Parm1Value Times Pi:" _
& (Parm1Value * matemaatika. PI) .ToString)

Vastupidine juhtub siis, kui Serialiseeri nimetatakse, kuid BinaryFormatter objektikõned GetObjectData selle asemel.

Avalik alam GetObjectData (_
ByVal teave kui SerializationInfo, _
ByVal kontekst kui StreamingContext) _
Rakendab ISerialiseeritavat. GetObjectData
värskendage seerialiseeritud andmepoodi
'programmi muutujatest
Kui Parm2Name = "Test", siis
info. AddValue ("a", "See on test.")
Muu
info. AddValue ("a", "Seekord testi ei tehta.")
Lõpeta If
info. AddValue ("b", 2)

Pange tähele, et andmed lisatakse serialiseeritud failile nime- / väärtuspaaridena.

Tundub, et paljudel selle artikli kirjutamiseks leitud veebilehtedel pole tegelikku töökoodi. Enne artikli kirjutamist võib tekkida küsimus, kas autor täitis mõnda koodi tegelikult.