Serializarea este procesul de transformare a unui obiect într-o secvență liniară de bytes numit „flux de byte”. Deserializarea doar inversează procesul. Dar de ce ai vrea să transformi un obiect într-un flux de octeți?
Motivul principal este acela pentru a putea muta obiectul. Luați în considerare posibilitățile. Întrucât „totul este un obiect” din .NET, puteți serializa orice și salva într-un fișier. Deci, puteți serializa imagini, fișiere de date, starea curentă a unui modul de program („stare” este ca un instantaneu al programului dvs. la un moment dat, astfel încât să puteți suspenda temporar execuția și să începeți din nou mai tarziu)... orice ai nevoie să faci.
De asemenea, puteți stoca aceste obiecte pe disc în fișiere, să le trimiteți pe web, să le treceți la un program diferit, să păstrați o copie de rezervă pentru siguranță sau securitate. Posibilitățile sunt literalmente nesfârșite.
De aceea, serializarea este un astfel de proces cheie în .NET și Visual Basic. Mai jos este o secțiune despre serializare personalizată prin implementarea
ISerializable interfață și codare a Nou și a GetObjectDatasubrutină.Ca un prim exemplu de serializare, să facem unul dintre cele mai ușoare programe, dar și unul dintre cele mai utile: serializarea datelor și apoi deserializarea datelor în clasă simplă către și dintr-un fișier. În acest exemplu, datele nu sunt doar serializate, dar și structura datelor este salvată. Structura de aici este declarată într-un modul pentru a păstra lucrurile... bine... structurate.
Modul SerializeParms
Public Parm1Name As String = "Parm1 Name"
Public Parm1Value As Integer = 12345
Public Parm2Name As String
Public Parm2Value Ca zecimal
Clasa finală
Modul final
Apoi, valorile individuale pot fi salvate într-un fișier ca acesta:
Sistemul de importuri. Runtime. Serializare. Formatters. Binar
Sistemul de importuri. IO
Clasa publică Form1
Sub privat MySerialize_Click (_
ByVal expeditor ca sistem. Obiect, _
Sistemul ByVal e As. EventArgs) _
Gestionează mySerialize. Clic
Dim ParmData Ca ParmExemplu nou
ParmData. Parm2Name = "Nume Parm2"
ParmData. Parm2Value = 54321.12345
Dim s Ca nou FileStream ("ParmInfo", FileMode. Crea)
Dim f Ca noul BinaryFormatter
f. Serializeze (ParmData)
s. Închide()
Sub final
Clasa finală
Și aceleași valori pot fi obținute astfel:
Sistemul de importuri. Runtime. Serializare. Formatters. Binar
Sistemul de importuri. IO
Clasa publică Form1
Sub Privat myDeserialize_Click (_
ByVal expeditor ca sistem. Obiect, _
Sistemul ByVal e As. EventArgs) _
Gestionează myDeserialize. Clic
Dim s = FileStream nou ("ParmInfo", FileMode. Deschis)
Dim f Ca noul BinaryFormatter
Dim RestoredParms Ca nou ParmExemple
RestoredParms = f. Deserializez (e)
s. Închide()
Consolă. WriteLine (RestoredParms). Parm1Name)
Consolă. WriteLine (RestoredParms). Parm1Value)
Consolă. WriteLine (RestoredParms). Parm2Name)
Consolă. WriteLine (RestoredParms). Parm2Value)
Sub final
Clasa finală
A Structura sau o colecție (cum ar fi un ArrayList) mai degrabă decât a Clasă ar putea fi, de asemenea, serializat într-un fișier în același mod.
Acum că am trecut peste procesul de serializare de bază, să ne uităm la detaliile specifice care fac parte din proces în pagina următoare.
Unul dintre primele lucruri pe care ar trebui să le observați despre acest exemplu este atribut în Clasă. atribute sunt doar mai multe informații pe care le puteți furniza VB.NET despre un obiect și sunt utilizate pentru o mulțime de lucruri diferite. Atributul din acest cod îi spune lui VB.NET să adauge cod suplimentar, pentru ca mai târziu, totul din această clasă să poată fi serializat.
Dacă există articole specifice din clasă pe care le nu doriți să fiți serializate, puteți utiliza atribut pentru a le exclude:
În exemplu, observația este aceea serializare și deserializati sunt metode ale BinaryFormatter obiect (f în acest exemplu).
f. Serializeze (ParmData)
Acest obiect ia FileStream obiect și obiectul care urmează să fie serializat ca parametri. Vom vedea că VB.NET oferă un alt obiect care permite exprimarea rezultatului ca XML.
Și o notă finală, dacă obiectul dvs. include și alte obiecte subordonate, acestea vor fi și serializate! Dar de atunci toate obiecte care sunt serializate trebuie sa fi marcat cu atribut, toate aceste obiecte copil trebuie să fie marcate în acest fel.
Doar pentru a fi complet clar despre ce se întâmplă în programul dvs., poate doriți să afișați fișierul numit ParmData în Notepad pentru a vedea cum arată datele serializate. (Dacă ați urmat acest cod, acesta ar trebui să fie în cos. debug dosarul din proiectul dvs.) Întrucât acesta este un fișier binar, cea mai mare parte a conținutului nu este text lizibil, dar ar trebui să puteți vedea orice șiruri în fișierul dvs. serializat. Vom face o versiune XML în continuare și poate doriți să le comparați pe cele două doar pentru a fi conștienți de diferență.
Serializarea în XML în locul unui fișier binar necesită foarte puține modificări. XML nu este la fel de rapid și nu poate captura unele informații despre obiect, dar este mult mai flexibil. XML poate fi folosit de aproape orice altă tehnologie software din lumea de azi. Dacă doriți să vă asigurați că structurile dvs. de fișiere nu vă "legă" cu Microsoft, aceasta este o opțiune bună pentru a vă analiza. Microsoft subliniază „LINQ to XML” pentru a crea fișiere de date XML în cea mai recentă tehnologie, dar multe persoane preferă încă această metodă.
„X” în XML înseamnă eXtensible. În exemplul nostru XML, vom folosi una dintre acele extensii de XML, o tehnologie numită SĂPUN. Aceasta însemna „Protocol de acces obiect simplu”, dar acum este doar un nume. (SOAP a fost actualizat atât de mult, încât numele original nu se mai potrivește atât de bine.)
Principalul lucru pe care trebuie să-l schimbăm în subrutinele noastre este declinarea formatatorului de serializare. Acest lucru trebuie schimbat atât în subrutină care serializează obiectul, cât și în cel care îl deserializează din nou. Pentru configurația implicită, aceasta implică trei modificări ale programului. În primul rând, trebuie să adăugați o Referință la proiect. Faceți clic dreapta pe proiect și selectați Adăugați referință .... A te asigura ...
Sistem. Runtime. Serializare. Formatters. Săpun
... a fost adăugat la proiect.
Apoi schimbați cele două afirmații din programul care face referire la acesta.
Sistemul de importuri. Runtime. Serializare. Formatters. Săpun
Dim f Ca nou săpun formator
De data asta, dacă verificați la fel ParmData fișier în Notepad, veți vedea că totul este într-un text XML care poate fi citit, cum ar fi ...
Există, de asemenea, o mulțime de XML suplimentare care sunt necesare pentru standardul SOAP, de asemenea, în fișier. Dacă doriți să verificați ce atributul face, puteți adăuga o variabilă cu acel atribut și priviți fișierul pentru a verifica dacă nu este inclus.
Exemplul pe care tocmai l-am codificat a seriat doar datele, dar să presupunem că trebuie să controlați cum sunt serializate datele. VB.NET pot face și asta!
Pentru a realiza acest lucru, trebuie să vă orientați puțin mai mult în conceptul de serializare. VB.NET are un nou obiect care să vă ajute aici: SerializationInfo. Deși aveți capacitatea de a codifica comportamentul de serializare personalizat, acesta aduce un cost suplimentar de codificare.
Baza suplimentar codul este prezentat mai jos. Nu uitați, această clasă este folosită în loc de ParmExample clasă prezentată în exemplul anterior. Acesta nu este un exemplu complet. Scopul este să vă arătăm noul cod care este necesar pentru serializare personalizată.
Sistemul de importuri. Runtime. serializare
Personalizare personală a clasei publice
Implementează Ierializabil
'datele care vor fi serializate aici
'Public SerializedVariable ca tip
Sub public nou ()
'constructor implicit atunci când clasa
'este creat - codul personalizat poate fi
a adăugat și aici
Sub final
Sub public nou (_
Informații ByVal ca SerializationInfo, _
Context ByVal ca StreamingContext)
'inițializează variabilele din program
„un magazin de date serializat
Sub final
Sub public GetObjectData (_
Informații ByVal ca SerializationInfo, _
Context ByVal ca StreamingContext) _
Implementează Ierializabil. GetObjectData
'actualizați stocarea de date serializată
'din variabilele programului
Sub final
Clasa finală
Ideea este că acum puteți (și, de fapt, voi trebuie sa) efectuați toate actualizarea și citirea datelor din depozitul de date serializat din Nou și GetObjectData subrutine. Trebuie să includeți și un generic Nou constructor (nicio listă de parametri) deoarece implementați o interfață.
Clasa va avea în mod normal proprietăți formale și metode codificate, de asemenea ...
„Proprietate generică
Private newPropertyValue As String
Proprietate publică NewProperty () ca șir
obține
Returnează newPropertyValue
Încheiați
Set (valoarea ByVal ca șir)
newPropertyValue = valoare
Set final
Proprietate finală
„Metodă generică
Sub public MyMethod ()
'codul metodei
Sub final
Clasa serializată rezultată poate crea valori unice în fișier pe baza codului furnizat. De exemplu, o clasă imobiliară ar putea actualiza o valoare și o adresă a unei case, dar clasa ar fi serializată și o clasificare de piață calculată.
Nou subrutină va arăta așa:
Sub public nou (_
Informații ByVal ca SerializationInfo, _
Context ByVal ca StreamingContext)
'inițializează variabilele din program
„un magazin de date serializat
Parm1Name = informații. GetString ( "a")
Parm1Value = informații. GetInt32 ( "b")
„Sub nou continuă ...
Cand deserializati este chemat pe un BinaryFormatter obiect, acest sub este executat și a SerializationInfo obiectul este trecut la Nou subrutină. Noua poate face apoi orice este necesar cu valorile datelor serializate. De exemplu ...
MsgBox ("Acesta este Parm1Value Times Pi:" _
& (Parm1Value * Math. PI) .ToString)
Reversul se întâmplă când serializare se numește, dar BinaryFormatter obiect apeluri GetObjectData in schimb.
Sub public GetObjectData (_
Informații ByVal ca SerializationInfo, _
Context ByVal ca StreamingContext) _
Implementează Ierializabil. GetObjectData
'actualizați stocarea de date serializată
'din variabilele programului
Dacă Parm2Name = "Test" Atunci
info. AddValue ("a", "Acesta este un test.")
altfel
info. AddValue ("a", "Niciun test de data asta.")
End If
info. AddValue ("b", 2)
Observați că datele sunt adăugate în fișierul serializat ca perechi nume / valoare.
Multe dintre paginile web pe care le-am găsit în scris acest articol par să nu aibă cod de lucru efectiv. Unul se întreabă dacă autorul a executat de fapt un cod înainte de a scrie articolul uneori.