Przeczytałem całkiem sporo artykułów na temat serializacji i jak to jest tak fajne i wspaniałe, ale żaden z argumentów nie był wystarczająco przekonujący. Zastanawiam się, czy ktoś naprawdę może mi powiedzieć, co naprawdę możemy osiągnąć, serializując zajęcia?Jaki jest cel serializacji w Javie?
Odpowiedz
Najpierw zdefiniujmy serializację, a potem porozmawiamy o tym, dlaczego jest tak przydatna.
Serializacja polega po prostu na zamianie 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żyta między JVM z tym samym kodem do wysyłania/odczytu obiektu.
Dlaczego mielibyśmy to robić?
Istnieje kilka powodów:
Komunikacja: Jeśli masz dwie maszyny, które są uruchomione tego samego kodu, a oni muszą się komunikować, łatwym sposobem jest jedna maszyna do budowy obiektu z informacją, że chciałby przesłać, a następnie serializować ten obiekt do drugiej maszyny. To nie jest najlepsza metoda komunikacji, ale wykonuje to zadanie.
Trwałość: Jeśli chcesz zapisać stan określonej operacji w bazie danych, można go łatwo serializować do tablicy bajtów i przechowywać w bazie danych w celu późniejszego pobrania.
Głębokie kopiowania: Jeśli potrzebujesz dokładnie replikę obiektu, i nie chce iść do kłopotów z pisania własnych wyspecjalizowanych clone() klasy, po prostu szeregowania obiektu do tablicy bajtów, a następnie odseparowanie go do innego obiektu osiąga ten cel.
Buforowanie: Naprawdę po prostu aplikacja z powyższego, ale czasami obiekt trwa 10 minut, ale jego rozszyfrowanie zajmuje tylko 10 sekund. Zamiast więc trzymać się gigantycznego obiektu w pamięci, po prostu spakuj go do pliku poprzez serializację i przeczytaj go później, kiedy będzie potrzebny.
Synchronizacja między maszynami wirtualnymi: Serializacja działa na różnych maszynach JVM, które mogą działać na różnych architekturach.
Co na ziemi trwa 10 minut do zbudowania? –
Moim argumentem jest (oczywiście), że we/wy pliku zaangażowane w serializację prawdopodobnie skłoni każdy czysty narzut tworzenia obiektu. Przypuszczam, że możesz mówić o czymś bardzo kosztownym pod względem obliczeniowym, jak modelowanie naukowe, ale serializacja jest bardzo słabym mechanizmem wytrwałości ze względu na trudność radzenia sobie ze zmianami schematu. –
@oxbow_lakes Przykładem może być zachowanie indeksu określonego zestawu danych do szybkiego wyszukiwania. Indeks taki jak ten może zająć bardzo dużo czasu, ale gdy już go zbudujesz, możesz go stosunkowo szybko przekształcić do postaci szeregowej/przekształcić w szereg. – David
Najbardziej oczywiste jest to, że można transmitować zserializowaną klasę przez sieć, , a odbiorca może skonstruować duplikat oryginalnego instanstance. Podobnie, można zapisać zserializowaną strukturę do systemu plików.
Należy również zauważyć, że serializacja ma charakter rekursywny, więc można serializować całą heterogeniczną strukturę danych w jednym pęcznieniu piankowym, w razie potrzeby.
serializacji jest procesem przekształcania zestaw wystąpień obiektów które zawierają odniesienia do siebie na liniowy strumień bajtów, który następnie przesyłany za pośrednictwem gniazda zapisane do pliku, lub po prostu manipulować jako strumień danych
See korzysta z Wiki:
Serializacja ma wiele zalet. Zapewnia.
- metoda utrzymujących przedmiotów jest wygodniejsze niż pisanie ich właściwości do pliku tekstowego na dysku i ponowne złożenie ich przez przeczytaniu tego z powrotem w
- się Sposób procedurę wydawania zdalnego połączenia, np jak w SOAP
- sposób obiektów dystrybucyjnych, zwłaszcza w oprogramowania componentry takich jak COM, CORBA, itp.
- Metoda wykrywania zmian w danych czasowych.
Obiekty serializowane utrzymać stan w przestrzeni, mogą być przenoszone przez sieć, system plików, itp ... i czas, mogą one przeżyć JVM, który je stworzył.
Czasami jest to przydatne.
Można to osiągnąć za pomocą prostego pliku zawierającego również tekst. Łatwiej jest odczytywać serializowany obiekt, a następnie odczytać stan obiektu zapisanego w pliku tekstowym, prawda? –
@m_a_khan: Wow. Tak, można to zrobić za pomocą prostego tekstu. Ale gdy tylko Obiekty staną się bardziej złożone, lub lepiej, ich struktury (kompozycja, dziedziczenie) staną się bardziej złożone, stanie się to kłopotem, aby ręcznie (nie) je uporządkować. Wyobraź sobie, że listy, zestawy i mapy są elementami obiektu. –
Łatwo wymyślić różne schematy serializacji i rzeczywiście wiele istnieje. Z bardzo dobrych powodów żadna z nich nie prowadzi do ogólnego przypadku, w "prostym tekście". –
Podczas korzystania z aplikacji wszystkie jego obiekty są przechowywane w pamięci (RAM). Kiedy wyjdziesz, pamięć zostanie odzyskana przez system operacyjny, a twój program "zapomina" o wszystkim, co się wydarzyło podczas pracy. Serializacja rozwiązuje ten problem, umożliwiając aplikacji zapisywanie obiektów na dysku, aby można je było odczytać przy następnym uruchomieniu. Jeśli twoja aplikacja zamierza zapewnić jakikolwiek sposób zapisania/udostępnienia poprzedniego stanu, będziesz potrzebować jakiejś formy serializacji.
Wygląda więc na to, że jest to lepszy, skuteczniejszy sposób zapisywania danych do pliku i odczytywania go w razie potrzeby? –
Ładne wyjaśnienie, dzięki! –
To jest jedyne PRAWDZIWE wyjaśnienie. Nie mogę wymyślić żadnego innego realnego zastosowania serializacji +1 – Emily
mogę podzielić się moją historię i mam nadzieję, że to daje jakieś pomysły dlaczego serializacji jest konieczne. Jednak odpowiedzi na twoje pytanie są już bardzo szczegółowo.
Miałem kilka projektów, które trzeba załadować i przeczytać kilka plików tekstowych. Pliki zawierały słowa kończące, czasowniki biomedyczne, skróty biomedyczne, słowa połączone semantycznie itp. Treść tych plików jest prosta: słowa!
Teraz dla każdego projektu, musiałem przeczytać 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 powszechne, ale zbędne, zadanie po pierwszym projekcie.
Tak, więc stworzyłem jeden obiekt do odczytania każdego z tych plików i wypełnienia poszczególnych tablic (zmienne instancji obiektów). Następnie serializowałem obiekty, a następnie dla późniejszych projektów, po prostu deserializowałem je. Nie musiałem czytać plików i zapełniać tablice raz po raz.
Używam serializowanych obiektów do standaryzacji argumentów przekazywanych do funkcji lub klas konstruktorów. Przekazywanie jednego serializowanego komponentu bean jest znacznie czystsze niż długa lista argumentów. Rezultatem jest kod, który jest łatwiejszy do odczytania i debugowania.
Moim zdaniem wyszukiwanie i używanie pojedynczego obiektu konfiguracyjnego jako parametru jest dość ortogonalne. Prawdopodobnie nie jest to typowy przypadek użycia. –
Dla prostego celu nauki (zauważ, powiedziałem, że nauka, nie powiedziałem najlepiej, a nawet dobrze, ale tylko ze względu na zrozumienie rzeczy), można zapisać swoje dane do pliku tekstowego na komputerze, następnie program, który odczytuje te informacje, i na podstawie pliku, możesz mieć swój program reagować inaczej. Gdybyś był bardziej zaawansowany, niekoniecznie musiałby to być plik txt, ale coś innego.
Serializacja z drugiej strony, umieszcza rzeczy bezpośrednio w języku komputerowym. To tak, jakbyś mówił coś po hiszpańsku komputerowi w języku hiszpańskim, zamiast mówić coś po francusku, zmuszając go do nauki francuskiego, a następnie zapisać rzeczy w rodzimym języku hiszpańskim, tłumacząc wszystko. Nie jest to najbardziej zaawansowana technologicznie odpowiedź. Po prostu staram się stworzyć zrozumiały przykład we wspólnym 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.
Podczas próby uporządkowania języka, tak naprawdę nie wyjaśniłeś serializacji w żaden przydatny sposób. – user3516726
Serializacja jest używana w przypadkach, w których chcesz zapisać stan obiektu i przekształcić go w strumień bajtów, obiekty należy poddać obróbce szeregowej. Podczas uruchamiania aplikacji wszystkie jego obiekty są przechowywane w pamięci (pamięć sterty). Kiedy wyjdziesz, pamięć zostanie odzyskana przez system operacyjny, a twój program "zapomina" o wszystkim, co się wydarzyło podczas pracy. W takich sytuacjach można użyć szeregowania, zezwalając aplikacji na zapisywanie obiektów na dysku, aby można je było odczytać przy następnym uruchomieniu. Jeśli twoja aplikacja zamierza zapewnić jakikolwiek sposób zapisania/udostępnienia poprzedniego stanu, będziesz potrzebować jakiejś formy serializacji.
Ilekroć obiekt musi przesłać przez sieć, obiekty te powinny zostać przekształcone do postaci szeregowej. Na przykład, jeśli masz dwie maszyny, które działają z tym samym kodem i muszą się komunikować, prostą metodą jest zbudowanie jednego obiektu z informacją, którą chciałbyś przekazać, a następnie serializacja tego obiektu na inny komputer. . To nie jest najlepsza metoda komunikacji, ale robi to z serializacją.
Synchronizacja JVM między seriami - serializacja działa na różnych wirtualnych maszynach Java JVM, które mogą działać na różnych architekturach.
Masz na myśli serializowanie klas lub obiektów? – Yoni
Co "nie było przekonujące" na temat ich argumentów? I dlaczego nie przyjąłeś odpowiedzi na swoje pytania? –
"Nie był przekonany" odpowiedzieli na jego pytania. –