Alt om serialisering i Visual Basic

Serialisering er processen med at konvertere et objekt til en lineær sekvens af bytes kaldte en "byte-strøm." Deserialisering vender bare processen. Men hvorfor ønsker du at konvertere et objekt til en byte-strøm?

Den vigtigste årsag er, at du kan flytte objektet rundt. Overvej mulighederne. Da "alt er et objekt" i .NET, kan du serialisere hvad som helst og gemme det i en fil. Så du kan serialisere billeder, datafiler, den aktuelle status for et programmodul ('tilstand' er som en snapshot af dit program på et tidspunkt, så du midlertidigt kunne suspendere udførelsen og starte igen senere)... hvad du skal gøre.

Du kan også gemme disse objekter på disken i filer, sende dem over nettet, videresende dem til et andet program, gemme en sikkerhedskopi af sikkerhed eller sikkerhed. Mulighederne er bogstaveligt talt uendelige.

Derfor er serialisering en sådan nøgleproces i .NET og Visual Basic. Nedenfor er et afsnit om tilpasset serialisering ved at implementere ISerializable interface og kodning a Ny og a GetObjectDataunderprogram.

instagram viewer

Som et første eksempel på serialisering, lad os gøre et af de nemmeste programmer, men også et af de mest nyttige: serialisere data og derefter deserialisere data i simpel klasse til og fra en fil. I dette eksempel er dataene ikke kun serialiserede, men strukturen af ​​dataene gemmes også. Strukturen her er erklæret i et modul til at bevare ting... godt... struktureret.

Modul SerializeParms
Offentlig klasse ParmExample
Public Parm1Name As String = "Parm1 Name"
Offentlig Parm1Value Som heltal = 12345
Offentlig Parm2Name som streng
Offentlig Parm2Value Som decimal
Slutteklasse
Slutmodul

Derefter kan individuelle værdier gemmes i en fil som denne:

Importsystem. Runtime. Serialisering. Formatere. Binary
Importsystem. IO
Offentlig klasseskema1
Privat sub mySerialize_Click (_
ByVal afsender som system. Objekt, _
ByVal e As System. EventArgs) _
Håndterer mySerialize. Klik
Dim ParmData som ny ParmExample
ParmData. Parm2Name = "Parm2-navn"
ParmData. Parm2Value = 54321.12345
Dim s Som nyt FileStream ("ParmInfo", FileMode. Skab)
Dim f Som ny BinaryFormatter
f. Serialize (s, ParmData)
s. Tæt()
Afslut under
Slutteklasse

Og de samme værdier kan hentes på denne måde:

Importsystem. Runtime. Serialisering. Formatere. Binary
Importsystem. IO
Offentlig klasseskema1
Privat sub myDeserialize_Click (_
ByVal afsender som system. Objekt, _
ByVal e As System. EventArgs) _
Håndterer myDeserialize. Klik
Dim s = New FileStream ("ParmInfo", FileMode. Åben)
Dim f Som ny BinaryFormatter
Dim RestoredParms som nyt eksempeleksempel
RestoredParms = f. Deserialisere (r)
s. Tæt()
Konsol. WriteLine (RestoredParms. Parm1Name)
Konsol. WriteLine (RestoredParms. Parm1Value)
Konsol. WriteLine (RestoredParms. Parm2Name)
Konsol. WriteLine (RestoredParms. Parm2Value)
Afslut under
Slutteklasse

EN Struktur eller en samling (såsom en ArrayList) snarere end en klasse kunne også serialiseres til en fil på samme måde.

Nu hvor vi har gennemgået den grundlæggende serialiseringsproces, lad os se på de specifikke detaljer, der er en del af processen på næste side.

En af de første ting, du skal bemærke ved dette eksempel, er attribut i klasse. Egenskaber er bare flere oplysninger, som du kan give VB.NET om et objekt, og de bruges til en masse forskellige ting. Attributten i denne kode fortæller VB.NET om at tilføje ekstra kode, så at alt senere i denne klasse kan serialiseres.

Hvis der er specifikke poster i klassen, som du gør ikke ønsker at blive serialiseret, kan du bruge attribut for at ekskludere dem:

Public Parm3Value As String = "Uanset hvad"

I eksemplet er opmærksom på, at føljeton og deserialisering er metoder til BinaryFormatter objekt (f i dette eksempel).

f. Serialize (s, ParmData)

Dette objekt tager FileStream objekt og objektet, der skal serialiseres som parametre. Vi ser, at VB.NET tilbyder et andet objekt, der tillader, at resultatet udtrykkes som XML.

Og en sidste note, hvis dit objekt inkluderer andre underordnede objekter, vil de også blive serialiseret! Men siden alle objekter, der er serialiserede skal markeres med attribut, skal alle disse underordnede objekter også markeres på den måde.

Bare for at være helt klar over, hvad der sker i dit program, skal du måske vise den navngivne fil ParmData i Notepad for at se, hvordan serialiserede data ser ud. (Hvis du fulgte denne kode, skal den være i beholder. Fejlfinde -mappen i dit projekt.) Da dette er en binær fil, er det meste af indholdet ikke læsbar tekst, men du skal være i stand til at se alle strenge i din serialiserede fil. Vi laver en XML-version næste, og du vil måske sammenligne de to bare for at være opmærksom på forskellen.

Serialisering til XML i stedet for en binær fil kræver meget få ændringer. XML er ikke så hurtig og kan ikke fange nogle objektoplysninger, men det er langt mere fleksibelt. XML kan bruges af næsten enhver anden softwareteknologi i verden i dag. Hvis du vil være sikker på, at dine filstrukturer ikke "binder dig ind i" Microsoft, er dette en god mulighed at undersøge. Microsoft understreger "LINQ til XML" for at oprette XML-datafiler i deres nyeste teknologi, men mange mennesker foretrækker stadig denne metode.

X'et i XML står for extensible. I vores XML-eksempel bruger vi en af ​​disse udvidelser af XML, en teknologi kaldet SÆBE. Dette plejede at betyde "Simple Object Access Protocol", men nu er det bare et navn. (SOAP er blevet opgraderet så meget, at det originale navn ikke passer så godt længere.)

Den vigtigste ting, vi er nødt til at ændre i vores underprogrammer, er deklationen af ​​serialiseringsformateringen. Dette skal ændres i både den subroutine, der serialiserer objektet og den, der deserialiserer det igen. For standardkonfigurationen involverer dette tre ændringer til dit program. Først skal du tilføje en reference til projektet. Højreklik på projektet, og vælg Tilføj reference .... Sørge for at ...

System. Runtime. Serialisering. Formatere. Sæbe

... er føjet til projektet.

Skift derefter de to udsagn i programmet, der refererer til det.

Importsystem. Runtime. Serialisering. Formatere. Sæbe
Dim f Som ny sæbeFormatter

Denne gang, hvis du tjekker det samme ParmData fil i Notepad, vil du se, at det hele er i læselig XML-tekst, som ...

Parm1-navn
12345
Parm2 Navn
54321.12345

Der er også en masse ekstra XML der, der også er nødvendigt for SOAP-standarden i filen. Hvis du vil bekræfte, hvad attribut gør, kan du tilføje en variabel med den attribut og se på filen for at kontrollere, at den ikke er inkluderet.

Eksemplet, vi bare kodede kun serialiserede dataene, men antag, at du er nødt til at kontrollere, hvordan dataene er serialiserede. VB.NET kan også gøre det!

For at opnå dette skal du komme lidt dybere ind i konceptet med serialisering. VB.NET har et nyt objekt til hjælp her: SerializationInfo. Selvom du har mulighed for at kode tilpasset serialiseringsopførsel, kommer det med en omkostning for ekstra kodning.

Det basale ekstra kode vises nedenfor. Husk, at denne klasse bruges i stedet for ParmExample klasse vist i det tidligere eksempel. Dette er ikke et komplet eksempel. Formålet er at vise dig den nye kode, der er nødvendig til brugerdefineret serialisering.

Importsystem. Runtime. serialisering
_
Offentlig klasse CustomSerialization
Implementerer ISerialiserbar
'data, der skal serialiseres her
'Public SerializedVariable as Type
Public Sub New ()
'standardkonstruktør, når klassen
'er oprettet - tilpasset kode kan være
tilføjet også her
Afslut under
Public Sub New (_
ByVal info Som SerializationInfo, _
ByVal-kontekst som StreamingContext)
initialiser dine programvariabler fra
'en serialiseret datalager
Afslut under
Public Sub GetObjectData (_
ByVal info Som SerializationInfo, _
ByVal-kontekst som StreamingContext) _
Implementerer ISerialiserbar. GetObjectData
'opdaterer den serialiserede datalager
'fra programvariabler
Afslut under
Slutteklasse

Ideen er, at nu kan du (og faktisk dig.) skal) foretage al opdatering og læsning af data i den serialiserede datalager i Ny og GetObjectData subrutiner. Du skal også medtage en generisk Ny konstruktør (ingen parameterliste), fordi du implementerer en grænseflade.

Klassen vil normalt have formelle egenskaber og metoder, der også kodes ...

'Generisk ejendom
Private newPropertyValue As String
Offentlig ejendom NewProperty () Som streng

Returner newPropertyValue
Slut Get
Sæt (ByVal-værdi som streng)
newPropertyValue = værdi
Afslut sæt
Slut ejendom
Generisk metode
Public Sub MyMethod ()
'metodekode
Afslut under

Den resulterende serialiserede klasse kan oprette unikke værdier i filen baseret på den kode, du leverer. For eksempel kan en fast ejendomsklasse opdatere værdien og adressen på et hus, men klassen vil også serialisere en beregnet markedsklassificering.

Det Ny subroutine ser sådan ud:

Public Sub New (_
ByVal info Som SerializationInfo, _
ByVal-kontekst som StreamingContext)
initialiser dine programvariabler fra
'en serialiseret datalager
Parm1Name = info. GetString ( "a")
Parm1Value = info. GetInt32 ( "B")
'Ny sub fortsætter ...

Hvornår deserialisering kaldes på en BinaryFormatter objekt, denne sub udføres, og a SerializationInfo objektet sendes til Ny underprogram. Nyt kan derefter gøre alt, hvad der er nødvendigt med de serialiserede dataværdier. For eksempel ...

MsgBox ("Dette er Parm1Value Times Pi:" _
& (Parm1Value * Math. PI) .ToString)

Det modsatte sker, når føljeton kaldes, men BinaryFormatter objektopkald GetObjectData i stedet.

Public Sub GetObjectData (_
ByVal info Som SerializationInfo, _
ByVal-kontekst som StreamingContext) _
Implementerer ISerialiserbar. GetObjectData
'opdaterer den serialiserede datalager
'fra programvariabler
Hvis Parm2Name = "Test" derefter
info. AddValue ("a", "Dette er en test.")
Andet
info. AddValue ("a", "Ingen test denne gang.")
Afslut Hvis
info. AddValue ("b", 2)

Bemærk, at dataene føjes til den serialiserede fil som navn / værdipar.

Mange af de websider, jeg har fundet ved skrivning af denne artikel, ser ikke ud til at have faktisk arbejdskode. Man spekulerer på, om forfatteren faktisk udførte nogen kode, før han undertiden skrev artiklen.

instagram story viewer