Serializacja to proces przekształcania obiektu w liniową sekwencję bajty nazywany „strumieniem bajtów”. Deserializacja po prostu odwraca proces. Ale dlaczego chcesz przekonwertować obiekt na strumień bajtów?
Głównym powodem jest to, że możesz przesuwać obiekt. Rozważ możliwości. Ponieważ „wszystko jest obiektem” w .NET, możesz serializować wszystko i zapisywać je w pliku. Aby można było serializować zdjęcia, pliki danych, bieżący stan modułu programu („stan” jest jak migawkę twojego programu w danym momencie, abyś mógł tymczasowo zawiesić wykonanie i zacząć od nowa później)... cokolwiek musisz zrobić.
Możesz również przechowywać te obiekty na dysku w plikach, wysyłać je przez Internet, przekazywać do innego programu, przechowywać kopię zapasową dla bezpieczeństwa lub ochrony. Możliwości są dosłownie nieograniczone.
Właśnie dlatego serializacja jest tak kluczowym procesem w .NET i Visual Basic. Poniżej znajduje się sekcja na temat niestandardowej serializacji poprzez wdrożenie ISerializable interfejs i kodowanie Nowy i a GetObjectDatapodprogram.
Jako pierwszy przykład serializacji zróbmy jeden z najłatwiejszych programów, ale także jeden z najbardziej użytecznych: serializowanie danych, a następnie deserializowanie danych w prostej klasie do i z pliku. W tym przykładzie dane są nie tylko serializowane, ale także zapisywana jest struktura danych. Struktura tutaj jest zadeklarowana w module, aby zachować rzeczy... dobrze... zbudowany.
Moduł SerializeParms
Publiczny Parm1Name jako ciąg = "Nazwa Parm1"
Public Parm1Value As Integer = 12345
Publiczny Parm2Name jako ciąg
Publiczny Parm2Value jako dziesiętny
Klasa końcowa
Moduł końcowy
Następnie poszczególne wartości można zapisać do pliku takiego jak ten:
System importu. Środowisko wykonawcze Serializacja. Formatery. Dwójkowy
System importu. IO
Formularz klasy publicznej 1
Private Sub mySerialize_Click (_
ByVal nadawca jako system. Obiekt, _
ByVal e As System. EventArgs) _
Obsługuje mySerialize. Kliknij
Dim ParmData As New ParmExample
ParmData. Parm2Name = "Nazwa Parm2"
ParmData. Parm2Value = 54321.12345
Dim s As New FileStream („ParmInfo”, FileMode. Stwórz)
Dim f As New BinaryFormatter
fa. Serialize (s, ParmData)
s. Blisko()
Napis końcowy
Klasa końcowa
Te same wartości można pobrać w następujący sposób:
System importu. Środowisko wykonawcze Serializacja. Formatery. Dwójkowy
System importu. IO
Formularz klasy publicznej 1
Private Sub myDeserialize_Click (_
ByVal nadawca jako system. Obiekt, _
ByVal e As System. EventArgs) _
Obsługuje myDeserialize. Kliknij
Dim s = New FileStream („ParmInfo”, FileMode. Otwarty)
Dim f As New BinaryFormatter
Dim RestoredParms As New ParmExample
RestoredParms = f. Deserializować (s)
s. Blisko()
Konsola. WriteLine (RestoredParms. Parm1Name)
Konsola. WriteLine (RestoredParms. Parm1Value)
Konsola. WriteLine (RestoredParms. Parm2Name)
Konsola. WriteLine (RestoredParms. Parm2Value)
Napis końcowy
Klasa końcowa
ZA Struktura lub kolekcja (taka jak ArrayList) zamiast Klasa można również serializować do pliku w ten sam sposób.
Teraz, gdy przeszliśmy przez podstawowy proces serializacji, przyjrzyjmy się szczegółom, które są częścią tego procesu na następnej stronie.
Jedną z pierwszych rzeczy, które powinieneś zauważyć w tym przykładzie, jest atrybut w Klasa. Atrybuty to tylko więcej informacji, które możesz podać VB.NET na temat obiektu i są one wykorzystywane do wielu różnych rzeczy. Atrybut tego kodu mówi VB.NET, aby dodał dodatkowy kod, aby później można było serializować wszystko w tej klasie.
Jeśli w klasie są określone przedmioty, które Ty nie chcesz zostać zserializowany, możesz użyć atrybut, aby je wykluczyć:
W tym przykładzie zauważamy, że Serializuj i Deserializuj są metodami BinaryFormatter obiekt (fa w tym przykładzie).
fa. Serialize (s, ParmData)
Ten obiekt przyjmuje FileStream obiekt i obiekt do serializacji jako parametry. Zobaczymy, że VB.NET oferuje inny obiekt, który pozwala wyrazić wynik jako XML.
I ostatnia uwaga, jeśli twój obiekt zawiera inne obiekty podrzędne, one również zostaną serializowane! Lecz odkąd wszystko obiekty, które są serializowane musi być oznaczonym atrybut, wszystkie te obiekty potomne również muszą być oznaczone w ten sposób.
Aby być całkowicie jasnym na temat tego, co dzieje się w twoim programie, możesz chcieć wyświetlić plik o nazwie ParmData w Notatniku, aby zobaczyć, jak wyglądają dane serializowane. (Jeśli zastosowałeś się do tego kodu, powinien on znajdować się w kosz. Odpluskwić folder w twoim projekcie.) Ponieważ jest to plik binarny, większość zawartości nie jest czytelnym tekstem, ale powinieneś być w stanie zobaczyć ciągi w pliku zserializowanym. Zrobimy wersję XML, a ty możesz porównać oba, aby mieć świadomość różnicy.
Serializacja do XML zamiast pliku binarnego wymaga bardzo niewielu zmian. XML nie jest tak szybki i nie może przechwytywać niektórych informacji o obiektach, ale jest o wiele bardziej elastyczny. XML może być używany przez prawie każdą inną technologię oprogramowania na świecie. Jeśli chcesz mieć pewność, że Twoje struktury plików nie „wiążą cię” z Microsoftem, jest to dobra opcja do sprawdzenia. Microsoft kładzie nacisk na „LINQ to XML”, aby tworzyć pliki danych XML w swojej najnowszej technologii, ale wiele osób nadal preferuje tę metodę.
„X” w XML oznacza eXrozciągliwy. W naszym przykładzie XML użyjemy jednego z tych rozszerzeń XML, zwanej technologią MYDŁO. Kiedyś oznaczało to „Simple Object Access Protocol”, ale teraz to tylko nazwa. (SOAP zostało zaktualizowane do tego stopnia, że pierwotna nazwa nie pasuje już tak dobrze).
Najważniejszą rzeczą, którą musimy zmienić w naszych podprogramach, jest deklacja formatyzatora serializacji. Należy to zmienić zarówno w podprogramie, który serializuje obiekt, jak i w tym, który ponownie szereguje go w szereg. W przypadku konfiguracji domyślnej obejmuje to trzy zmiany w programie. Najpierw musisz dodać odniesienie do projektu. Kliknij projekt prawym przyciskiem myszy i wybierz Dodaj odniesienie .... Upewnić się ...
System. Środowisko wykonawcze Serializacja. Formatery. Mydło
... został dodany do projektu.
Następnie zmień dwie instrukcje programu, które się do niego odwołują.
System importu. Środowisko wykonawcze Serializacja. Formatery. Mydło
Dim f As New SoapFormatter
Tym razem, jeśli sprawdzisz to samo ParmData plik w Notatniku, zobaczysz, że całość jest w czytelnym tekście XML, takim jak ...
W pliku znajduje się również wiele dodatkowych plików XML, które są niezbędne dla standardu SOAP. Jeśli chcesz sprawdzić, co atrybut robi, możesz dodać zmienną z tym atrybutem i spojrzeć na plik, aby sprawdzić, czy nie jest on uwzględniony.
Przykład, który właśnie zakodowaliśmy, serializował tylko dane, ale załóżmy, że musisz kontrolować sposób serializacji danych. VB.NET też mogę to zrobić!
Aby to osiągnąć, musisz głębiej poznać koncepcję serializacji. VB.NET ma nowy obiekt do pomocy tutaj: SerializationInfo. Chociaż możesz kodować niestandardowe zachowanie serializacji, wiąże się to z dodatkowym kodowaniem.
Podstawy dodatkowy kod pokazano poniżej. Pamiętaj, że ta klasa jest używana zamiast ParmExample klasa pokazana we wcześniejszym przykładzie. To nie jest kompletny przykład. Celem jest pokazanie nowego kodu potrzebnego do niestandardowej serializacji.
System importu. Środowisko wykonawcze Serializacja
CustomSerialization klasy publicznej
Implementuje ISerializable
„dane do serializacji tutaj
„Public SerializedVariable as Type
Sub publiczny nowy ()
domyślny konstruktor, gdy klasa
”jest tworzony - może być niestandardowy kod
- również tutaj dodane
Napis końcowy
Subwoofer publiczny Nowy (_
ByVal info As SerializationInfo, _
Kontekst ByVal jako StreamingContext)
'zainicjuj zmienne programu z
„zserializowany magazyn danych
Napis końcowy
Publiczny sub GetObjectData (_
ByVal info As SerializationInfo, _
Kontekst ByVal jako StreamingContext) _
Implementuje ISerializable. GetObjectData
„zaktualizuj zserializowany magazyn danych
„ze zmiennych programu
Napis końcowy
Klasa końcowa
Chodzi o to, że teraz możesz (i faktycznie możesz musi) wykonaj wszystkie aktualizacje i odczyt danych w serializowanym magazynie danych w Nowy i GetObjectData podprogramy. Musisz także podać ogólny Nowy konstruktor (brak listy parametrów), ponieważ implementujesz interfejs.
Klasa będzie normalnie mieć także formalne właściwości i metody ...
„Właściwość ogólna
Prywatny newPropertyValue As String
Właściwość publiczna NewProperty () jako ciąg
Otrzymać
Zwraca newPropertyValue
End Get
Zestaw (wartość ByVal jako ciąg)
newPropertyValue = wartość
Zestaw końcowy
Zakończ właściwość
„Metoda ogólna
Public Sub MyMethod ()
„kod metody
Napis końcowy
Wynikowa klasa serializowana może tworzyć unikalne wartości w pliku na podstawie dostarczonego kodu. Na przykład klasa nieruchomości może aktualizować wartość i adres domu, ale klasa również serializuje obliczoną klasyfikację rynkową.
The Nowy podprogram będzie wyglądał mniej więcej tak:
Subwoofer publiczny Nowy (_
ByVal info As SerializationInfo, _
Kontekst ByVal jako StreamingContext)
'zainicjuj zmienne programu z
„zserializowany magazyn danych
Parm1Name = informacje. GetString („a”)
Parm1Value = informacje. GetInt32 („b”)
„Nowy okręt podwodny trwa ...
Gdy Deserializuj nazywa się BinaryFormatter obiekt, ten sub jest wykonywany i a SerializationInfo obiekt jest przekazywany do Nowy podprogram. Nowy może wtedy zrobić wszystko, co jest konieczne z serializowanymi wartościami danych. Na przykład ...
MsgBox („To jest Parm1Value Times Pi:” _
& (Parm1Value * Math. PI) .ToString)
Odwrotna sytuacja ma miejsce, gdy Serializuj nazywa się, ale BinaryFormatter wywołania obiektów GetObjectData zamiast.
Publiczny sub GetObjectData (_
ByVal info As SerializationInfo, _
Kontekst ByVal jako StreamingContext) _
Implementuje ISerializable. GetObjectData
„zaktualizuj zserializowany magazyn danych
„ze zmiennych programu
Jeśli Parm2Name = „Test”, to
informacje. AddValue („a”, „To jest test.”)
Jeszcze
informacje. AddValue („a”, „Tym razem brak testu.”)
End If
informacje. AddValue („b”, 2)
Zauważ, że dane są dodawane do serializowanego pliku jako pary nazwa / wartość.
Wiele stron internetowych, które znalazłem podczas pisania tego artykułu, nie ma faktycznie działającego kodu. Zastanawia się, czy autor rzeczywiście napisał jakiś kod, zanim napisał artykuł.