Jaki jest cel serializacji w Javie?


105

Przeczytałem sporo artykułów na temat serializacji i tego, że jest tak fajna i świetna, ale żaden z argumentów nie był wystarczająco przekonujący. Zastanawiam się, czy ktoś naprawdę może mi powiedzieć, co tak naprawdę możemy osiągnąć poprzez serializację klasy?


10
Co „nie było przekonujące” w ich argumentach? Dlaczego nie zaakceptowałeś odpowiedzi na swoje pytania?
Anon.

8
Nie był przekonany, że odpowiedzieli na jego pytania.
Anthony Forloney,

5
Udzielone odpowiedzi były w rzeczywistości poprawne. Jeśli nie działają dla Ciebie, odpowiedz na nie jako komentarze i spróbuj to rozwiązać, zamiast po prostu je ignorować, a następnie zacznij palić innych, gdy wskażą, że nie używasz SO dobrze.
Anon.

4
Anon przyczynia się do poprawy jakości strony, zniechęcając do powtarzających się pytań. Głupio jest widzieć pięć oddzielnych pytań, które zadają to samo. Jeśli nie możesz uzyskać odpowiedzi, czasami tak właśnie jest. Jeśli otrzymasz odpowiedź, ale wydaje się, że nie działa, kontynuuj dyskusję w komentarzach. SO nie jest magicznym pudełkiem, które w magiczny sposób da ci odpowiedź, jeśli po prostu zadasz właściwe pytanie lub zadasz wystarczająco dużo razy, lub przyciągniesz uwagę odpowiedniego eksperta.
Chris,

1
Albo: (Zaakceptuj odpowiedź) albo (Opublikuj komentarz i / lub popraw pytanie, wyjaśniając, dlaczego nie jest to to, czego potrzebujesz).
Anon.

Odpowiedzi:


183

Najpierw zdefiniujmy serializację, a następnie porozmawiajmy o tym, dlaczego jest tak przydatna.

Serializacja to po prostu zamiana istniejącego obiektu na tablicę bajtów. Ta tablica bajtów reprezentuje klasę obiektu, wersję obiektu i stan wewnętrzny obiektu. Ta tablica bajtów może być następnie używana między maszynami JVM uruchamiającymi ten sam kod do przesyłania / odczytu obiektu.

Dlaczego mielibyśmy to robić?

Jest kilka powodów:

  • Komunikacja: Jeśli masz dwie maszyny, które działają z tym samym kodem i muszą się komunikować, prostym sposobem jest zbudowanie przez jedną maszynę obiektu z informacjami, które chciałby przesłać, a następnie serializacji tego obiektu na drugiej maszynie. Nie jest to najlepsza metoda komunikacji, ale spełnia swoje zadanie.

  • Trwałość: jeśli chcesz przechowywać stan określonej operacji w bazie danych, można ją łatwo serializować do tablicy bajtów i przechowywać w bazie danych w celu późniejszego pobrania.

  • Głęboka kopia: Jeśli potrzebujesz dokładnej repliki obiektu i nie chcesz kłopotać się pisaniem własnej wyspecjalizowanej klasy clone (), po prostu serializuj obiekt do tablicy bajtów, a następnie deserializuj go do innej obiekt osiąga ten cel.

  • Buforowanie: w rzeczywistości tylko aplikacja z powyższego, ale czasami kompilacja obiektu zajmuje 10 minut, ale deserializacja zajmuje tylko 10 sekund. Więc zamiast trzymać gigantyczny obiekt w pamięci, po prostu zbuforuj go do pliku poprzez serializację i przeczytaj go później, gdy będzie potrzebny.

  • Synchronizacja między maszynami JVM: Serializacja działa na różnych maszynach JVM, które mogą działać na różnych architekturach.


62
Co, u licha, zbudowanie zajmuje 10 minut?
oxbow_lakes

2
Chodzi mi o to (oczywiście), że plik I / O zaangażowany w serializację prawdopodobnie przyćmi wszelkie narzuty związane z tworzeniem czystych obiektów. Przypuszczam, że możesz mówić o czymś bardzo kosztownym obliczeniowo, takim jak modelowanie naukowe, ale serializacja jest bardzo słabym mechanizmem trwałości, ponieważ trudno jest obsłużyć zmiany schematu
oxbow_lakes

11
@oxbow_lakes Przykładem może być zachowanie indeksu określonego zestawu danych w celu szybkiego wyszukiwania. Utworzenie takiego indeksu może zająć bardzo dużo czasu, ale po utworzeniu można go serializować / zdeserializować stosunkowo szybko.
David

Jeśli żądanie aplikacji internetowej musi przejść przez każdy router na świecie, zanim dotrze do celu, zbudowania obiektu i powrotu z obiektem przy użyciu najdłuższej możliwej ścieżki, tak, może to zająć 10 minut.
Vaibs,

@Schmelter, Skoro wspomniałeś, że serializacja nie jest najlepszą metodą komunikacji, która jest trafna i najlepsza do zaimplementowania?
Ashfaque Rifaye

58

Podczas uruchamiania aplikacji wszystkie jej obiekty są przechowywane w pamięci (RAM). Kiedy wychodzisz, ta pamięć jest odzyskiwana przez system operacyjny, a program zasadniczo „zapomina” o wszystkim, co się wydarzyło, gdy był uruchomiony. Serializacja rozwiązuje ten problem, umożliwiając aplikacji zapisywanie obiektów na dysku, aby mogła je odczytać przy następnym uruchomieniu. Jeśli Twoja aplikacja ma zapewnić jakikolwiek sposób zapisywania / udostępniania poprzedniego stanu, będziesz potrzebować jakiejś formy serializacji.


2
Wygląda więc na to, że jest to po prostu lepszy, bardziej wydajny sposób zapisywania danych do pliku i odczytywania ich z powrotem w razie potrzeby?
m_a_khan

1
To jedyne PRAWDZIWE wyjaśnienie. Nie
Emily

Krótkie i słodkie. Doskonałe wyjaśnienie.
Yakhoob

21

Mogę podzielić się swoją historią i mam nadzieję, że dostarczy ona kilku pomysłów, dlaczego serializacja jest konieczna. Jednak odpowiedzi na Twoje pytanie są już niezwykle szczegółowe.

Miałem kilka projektów, które wymagały załadowania i odczytania kilku plików tekstowych. Pliki zawierały słowa pomijane, czasowniki biomedyczne, skróty biomedyczne, słowa połączone ze sobą semantycznie itp. Zawartość tych plików jest prosta: słowa !

Teraz dla każdego projektu musiałem odczytać słowa z każdego z tych plików i umieścić je w różnych tablicach; Ponieważ zawartość pliku nigdy się nie zmieniła, stało się to powszechnym, choć zbędnym zadaniem po pierwszym projekcie.

Więc stworzyłem jeden obiekt do odczytu każdego z tych plików i zapełnienia poszczególnych tablic (zmiennych instancji obiektów). Następnie serializowałem obiekty, a następnie dla późniejszych projektów po prostu je deserializowałem. Nie musiałem czytać plików i ponownie wypełniać tablic.


1
W takim przypadku, dlaczego musisz przechowywać je w strumieniu tablicy bajtów (używając serializacji), czy może to być prostsze niż użycie pola tymczasowego?
kidnan1991

3

W istocie :

Serializacja to proces konwertowania zestawu instancji obiektów, które zawierają wzajemne odniesienia, w liniowy strumień bajtów, który można następnie wysłać przez gniazdo, zapisać w pliku lub po prostu zmanipulować jako strumień danych

Zobacz zastosowania z Wiki :

Serializacja ma wiele zalet. To zapewnia:

  1. metoda utrwalania obiektów, która jest wygodniejsza niż zapisywanie ich właściwości w pliku tekstowym na dysku i ponowne składanie ich przez ponowne odczytanie.
  2. sposób wywoływania zdalnych procedur, np. jak w SOAP
  3. metoda dystrybucji obiektów, zwłaszcza w komponentach oprogramowania, takich jak COM, CORBA itp.
  4. metoda wykrywania zmian w danych zmieniających się w czasie.

1

Najbardziej oczywiste jest to, że możesz przesyłać serializowaną klasę przez sieć, a odbiorca może utworzyć duplikat oryginalnej instancji. Podobnie możesz zapisać zserializowaną strukturę w systemie plików.

Należy również zauważyć, że serializacja jest cykliczna, więc w razie potrzeby można serializować całą heterogeniczną strukturę danych w jednej pęczce.


0

Zserializowane obiekty utrzymują stan w przestrzeni, mogą być przesyłane przez sieć, system plików itp. ... i czas, mogą przetrwać JVM, który je utworzył.

Czasami jest to przydatne.


Można to osiągnąć za pomocą prostego pliku zawierającego również tekst. Trochę łatwiej jest odczytać z powrotem zserializowany obiekt niż odczytać stan obiektu zapisanego do pliku tekstowego, prawda?
m_a_khan

@m_a_khan: Wow. Tak, można to zrobić za pomocą prostego tekstu. Ale gdy tylko obiekty staną się bardziej złożone lub lepsze, ich struktury (kompozycja, dziedziczenie) staną się bardziej złożone, ręczne (nie) uporządkowanie ich będzie kłopotliwe. Wyobraź sobie listy, zbiory i mapy jako elementy składowe obiektów.
Dirk Schumacher

Łatwo jest wymyślić różne schematy serializacji i rzeczywiście istnieje wiele. Z bardzo dobrych powodów żaden z nich nie prowadzi do ogólnego przypadku, w „prostym tekście”
David Soroko

0

Używam obiektów serializowanych do standaryzacji argumentów, które przekazuję do funkcji lub konstruktorów klas. Przekazanie jednego serializowanego komponentu bean jest znacznie czystsze niż długa lista argumentów. Rezultatem jest kod, który jest łatwiejszy do odczytania i debugowania.


1
Moim zdaniem wyszukiwanie i używanie pojedynczego obiektu konfiguracyjnego jako parametru są dość ortogonalne. Prawdopodobnie nie jest to typowy przypadek użycia.
Gábor Bakos

0

Dla prostego celu uczenia się (uwaga, powiedziałem uczenie się, nie powiedziałem najlepiej, ani nawet dobrze, ale tylko po to, aby zrozumieć rzeczy), możesz zapisać swoje dane do pliku tekstowego na komputerze, a następnie mieć program który odczytuje te informacje i na podstawie pliku możesz mieć inny program. Gdybyś był bardziej zaawansowany, niekoniecznie musiałby to być plik txt, ale coś innego.

Z drugiej strony serializacja przekłada rzeczy bezpośrednio na język komputerowy. To tak, jakbyś mówił hiszpańskiemu komputerowi coś po hiszpańsku, zamiast mówić mu coś po francusku, zmuszając go do nauki francuskiego, a następnie zapisując wszystko w rodzimym hiszpańskim, tłumacząc wszystko. Nie jest to najbardziej zaawansowana technologicznie odpowiedź, po prostu próbuję stworzyć zrozumiały przykład w popularnym formacie językowym.

Serializacja jest również szybsza, ponieważ w Javie obiekty są obsługiwane na stercie i trwają znacznie dłużej, niż gdyby były reprezentowane jako prymitywy na stosie. Prędkość, prędkość, prędkość. I mniej przetwarzania plików z punktu widzenia programisty.


Próbując przedstawić rzeczy prostym angielskim, tak naprawdę nie wyjaśniłeś serializacji w żaden użyteczny sposób.
user3516726
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.