Przewodnik po serializacji C ++

Przewodnik po serializacji C ++
Serializacja przekształca obiekt w strumień bajtów, który ma być przechowywany na dysku lub wysyłanie do innego komputera za pośrednictwem sieci. Istnieją dwa rodzaje obiektów w C ++: fundamentalne obiekty i obiekty utworzone z określonej klasy. Uwaga, w C ++ struktura jest uważana za klasę, a nazwa struktury reprezentuje instanowany obiekt struktury.

Poszczególne obiekty podstawowe nie są zwykle serializowane. Ponieważ jednak instanowany obiekt ma fundamentalne obiekty, ponieważ cały obiekt jest serializowany, obiekty podstawowe są również serializowane. W C ++ wszystkie struktury danych, takie jak wektor, są predefiniowanymi klasami.

Serializacja jest również nazywana marszałkiem. Przeciwieństwem serializacji jest deserializacja lub niezmarowa. Obiekt serializowany jako plik z dysku lub sieci można przekonwertować (wskrzeszone) na obiekt na komputerze lokalnym, aby używać lokalnej aplikacji C ++ (program).

W tym artykule prowadzi Cię do lepszego zrozumienia bibliotek serializacji C ++ i sposobu napisania własnej biblioteki serializacji. Koncentruje się na serializowanym standardowym strumieniu, JSON - patrz poniżej.

Treść artykułu

  • Strumień binarny i tekstowy
  • Główne cele
  • JSON Stream
  • Składnia JSON
  • Wartość danych JSON
  • Porównanie obiektów C ++ i JSON
  • Więcej, aby wiedzieć
  • Wniosek

Strumień binarny i tekstowy

Dwójkowy
Mówi się, że skompilowany program C ++ jest w formie binarnej. Serializowany strumień może być w formie binarnej. Jednak w tym artykule nie uwzględni binarnych obiektów serializowanych.

Tekst
Serializowany strumień może być w formie tekstowej. Dwa standardy tekstu, które są dziś używane, to JSON i XML. Łatwiej jest zrozumieć i obsłużyć JSON niż zrozumieć i obsługiwać XML. Więc JSON jest używany w tym artykule.

Główne cele

Głównymi celami serializacji jest to, że serializowany strumień powinien być kompatybilny i kompatybilny do przodu. Powinno być również możliwe do użycia w różnych systemach operacyjnych i różnych architekturach komputerowych.

Wersja
Załóżmy, że napisałeś program i wysłałeś go do klienta, a klient jest zadowolony. W porządku. Później klient potrzebuje modyfikacji. Jednak dziś klient zatrudnił własnego programisty. Programista prosi o dodanie innej właściwości (członka danych) do klasy i wysłania odpowiednich celów za pośrednictwem sieci. Zamierza dopasować obiekt do programu; Kiedy to zrobisz, serializowany strumień będzie musiał być do tyłu kompatybilny ze starym obiektem.

Specyfikacja C ++ i innych języków zmienia się w czasie. W niektórych specyfikacjach jesteś poinformowany o niektórych zmianach, które będą miały miejsce w następnych i przyszłych specyfikacjach. Zwykle nie jest możliwe poinformowanie o wszystkich zmianach, które będą miały miejsce. Zatem twój serializowany strumień powinien być zgodny z przodu, o ile dotyczy to tych nowych przyszłych zmian. Kompatybilność do przodu ma swoje granice, ponieważ nie można określić wszystkich przyszłych zmian.

Zarówno kompatybilność do przodu, jak i do tyłu jest obsługiwana przez schemat o nazwie Versioning.

JSON Stream

JSON oznacza notację obiektu JavaScript.

JSON to format tekstowy do przechowywania i transportu danych.

JSON jest „opisywany”.

JSON jest również starym standardem, więc dobrze pasuje do serializacji tekstu i deserializacji tekstu C ++. Tak więc, aby wysłać obiekt utworzony przez C ++, przekonwertować go na obiekt JSON i wyślij. Tuż przed wysłaniem obiektu JSON nazywa się to strumieniem. Gdy obiekt JSON jest odbierany w swojej sekwencji, nadal nazywa się go strumieniem do deserializacji.

Składnia JSON

Z JSON, punkt odniesienia jest parą klucza/wartości. Na przykład w

„Nazwa”: „Smith”

Nazwa jest kluczem, a Smith to wartość. Obiekt jest ograniczony przez aparat ortodontyczny, jak w:

„Nazwa”: „Smith”, „wysokość”: 1.7

Dane są oddzielone przecinkami. Każdy tekst, niezależnie od tego, czy jest to klucz, czy wartość, musi znajdować się w podwójnych cytatach. Liczby są napisane bez cytatów.

Tablica jest wyznaczona przez kwadratowe nawiasy jak w:

[„Orange”, „banana”, „gruszka”, „cytryna”]

W poniższym kodzie istnieje jedna odnaścienia, której wartość jest tablica i zidentyfikowana przez ARR

„Arr”: [„Orange”, „banan”, „gruszka”, „cytryna”]

Uwaga: Obiekty mogą być zagnieżdżone w JSON, a wraz z tym można zidentyfikować obiekty.

Wartość danych JSON

Możliwa wartość odniesienia JSON to:

  • ciąg
  • numer
  • obiekt
  • tablica
  • Boolean
  • zero
  • funkcja (ale w podwójnych cytatach)

Data C ++ lub jakikolwiek inny obiekt nie na tej liście musi zostać przekonwertowany na dosłowny ciąg, aby stać się wartością JSON.

Porównanie obiektów C ++ i JSON

Poniżej znajduje się prosty program C ++ z prostym obiektem, domyślnego konstruktora:

#włączać
za pomocą przestrzeni nazw Std;
klasa thecla

publiczny:
int num;
int Mthd (int it)

zwróc to;

;
int main ()

Thecla obj;
int no = obj.MTHD (3);
Cout << no << endl;
powrót 0;

Równoważny obiekt JSON jest następujący:

„obj”: „num”: null, „mthd”: „int mthd (int it) return it;”

Obiekt JSON jest z definicji serializowany.

Zwróć uwagę, jak wskazano nazwę obiektu. Zwróć też uwagę, jak wskazana nazwa funkcji. Na końcu odbierania program C ++ dla deserializacji będzie musiał przekonwertować to na klasę i obiekt C ++, a następnie skompilować. Program będzie również musiał rozpoznać funkcję w formie ciągów, usunąć podwójne cytaty i mieć funkcję jako tekst przed kompilacji.

Aby to ułatwić, należy wysłać metadane. Metadane to dane o danych. Można wysłać mapę C ++ z metadanami. Mapa to sam obiekt C ++, który będzie musiał zostać przekonwertowany na obiekt JSON. Zostanie wysłany, a następnie obiekt zainteresowania JSON.

Obiekt JSON jest obiektem strumieniowym. Po przygotowaniu należy go wysłać do obiektu C ++ Ostream, aby zostać zapisanym jako plik lub wysłać sieć. Na komputerze odbierającym Istream C ++ otrzyma sekwencję. Następnie zostanie przejęty przez program deserializacji, który odtworzy obiekt w formacie C ++. Ostream i Istream to obiekty fstream C ++.

Uwaga: W JavaScript (ecMascript) wywoływana jest serializacja, stringowanie i deserializacja nazywa się parsingiem.

Obiekt JSON i obiekt JavaScript

Obiekt JSON i obiekt JavaScript są podobne. Obiekt JavaScript ma mniej ograniczeń niż obiekt JSON. Obiekt JSON został zaprojektowany z obiektu JavaScript, ale dziś może być używany przez wiele innych języków komputerowych. JSON jest najczęstszym archiwum (sekwencja serializowana) używana do wysyłania danych między serwerami internetowymi a ich klientami. Biblioteki C ++ używają JSON, ale żaden z nich nie spełnia większości celów wyprodukowania archiwum dla C++.

Uwaga: W JavaScript funkcja nie jest ciągiem. Każda funkcja otrzymana jako ciąg jest konwertowana na normalną funkcję składniową.

Więcej, aby wiedzieć

Oprócz znaczenia powyższego, aby stworzyć dla siebie serializację lub bibliotekę deserializacyjną, musisz również wiedzieć:

  • jak wyrażać wskaźniki C ++ do obiegu w formacie JSON;
  • Jak wyrazić dziedziczenie C ++ w formacie JSON;
  • Jak wyrazić polimorfizm C ++ w formacie JSON; I
  • Więcej o JSON.

Wniosek

Serializacja przekształca obiekt w strumień bajtów, który ma być przechowywany na dysku lub wysyłanie do innego komputera za pośrednictwem sieci. Deserializacja to odwrócony proces serializowanego strumienia, który nazywa się archiwum.

Zarówno fundamentalne obiekty, jak i instanowane obiekty mogą być serializowane. Pojedyncze fundamentalne obiekty są prawie nie serializowane. Ponieważ jednak instanowany obiekt ma fundamentalne obiekty, fundamentalne obiekty są serializowane wraz z całością.

Serializacja ma jedną wadę, że ujawnia prywatnych członków obiektu C ++. Problem ten można rozwiązać, wykonując serializację w binarnej. W przypadku tekstu metadane można wysłać, aby wskazać prywatnych członków; Ale programista na drugim końcu może nadal znać prywatnych członków.

Być może już zapisałeś na dysku lub wysłałeś program kodu binarnego lub źródłowego za pośrednictwem wiadomości e -mail i możesz zastanawiać się: po co zapisać lub wysyłać tylko obiekt. Cóż, w C ++ mogłeś zdać sobie sprawę, że cała biblioteka może składać się tylko z jednej klasy, być może z pewnym dziedzictwem. Klasa może być dłuższa niż wiele krótkich programów C ++. Tak więc jednym z powodów wysyłania obiektów jest to, że niektóre obiekty są zbyt duże. Programowanie obiektowe (OOP) obejmuje interakcję obiektów, podobnie jak oddziaływanie zwierząt, roślin i narzędzi. Innym powodem jest to, że OOP się poprawia, a programiści wolą radzić sobie z obiektami niż z całą aplikacją, co może być zbyt duże.

C ++ nie ma jeszcze standardowego formatu archiwum dla tekstu lub binarnego, chociaż istnieją biblioteki serializacji serializacji i deserializacji C ++. Żadne z nich nie jest naprawdę zadowalające. Format archiwum tekstu dla JavaScript to JSON. JSON może być używany z dowolnym językiem komputerowym. Tak więc, z powyższym przewodnikiem, powinieneś być w stanie wyprodukować własną bibliotekę do marszalowania C ++.