Co dokładnie oznacza, że klasa jest Serializable
w Javie? Lub ogólnie, jeśli o to chodzi ...
java
serializable
Ritwik Bose
źródło
źródło
Serializable
:Serializability of a class is enabled by the class implementing the java.io.Serializable interface. Classes that do not implement this interface will not have any of their state serialized or deserialized. All subtypes of a serializable class are themselves serializable. The serialization interface has no methods or fields and serves only to identify the semantics of being serializable.
Odpowiedzi:
Serializacja polega na utrwalaniu obiektu z pamięci do sekwencji bitów, na przykład w celu zapisania na dysku. Deserializacja jest odwrotna - odczyt danych z dysku w celu uwodnienia / stworzenia obiektu.
W kontekście twojego pytania jest to interfejs, który po zaimplementowaniu w klasie ta klasa może być automatycznie serializowana i deserializowana przez różne serializatory.
źródło
Chociaż większość użytkowników już udzieliła odpowiedzi, ale chciałbym dodać przykład dla tych, którzy tego potrzebują, aby wyjaśnić pomysł:
Załóżmy, że masz osobę z klasy, taką jak ta:
a następnie tworzysz taki obiekt:
Możesz serializować ten obiekt do wielu strumieni. Zrobię to dla dwóch strumieni:
Serializacja na standardowe wyjście:
Serializacja do pliku:
Następnie:
Deserializacja z pliku:
źródło
Oznacza to, że instancje klasy można przekształcić w strumień bajtów (na przykład w celu zapisania do pliku), a następnie ponownie przekształcić w klasy. To przeładowanie może nastąpić w innej instancji programu lub nawet na innym komputerze. Serializacja (w dowolnym języku) wiąże się jednak z różnego rodzaju problemami, zwłaszcza gdy masz odniesienia do innych obiektów w obrębie tego, który można serializować.
źródło
Oto szczegółowe wyjaśnienie serializacji : (mój własny blog)
Serializacja:
Serializacja to proces serializacji stanu obiektu, który jest reprezentowany i przechowywany w postaci sekwencji bajtów. Można to zapisać w pliku. Proces odczytywania stanu obiektu z pliku i przywracania go nazywa się deserializacją.
Jaka jest potrzeba serializacji?
We współczesnej architekturze zawsze istnieje potrzeba przechowywania stanu obiektu, a następnie jego pobierania. Na przykład w Hibernate, aby przechowywać obiekt, powinniśmy uczynić klasę Serializable. To, co robi, polega na tym, że po zapisaniu stanu obiektu w postaci bajtów można go przenieść do innego systemu, który może następnie odczytać stan i pobrać klasę. Stan obiektu może pochodzić z bazy danych lub innego pliku jvm lub z oddzielnego komponentu. Za pomocą serializacji możemy pobrać stan obiektu.
Kod Przykład i objaśnienie:
Najpierw spójrzmy na klasę przedmiotu:
W powyższym kodzie widać, że klasa Item implementuje Serializable .
To jest interfejs, który umożliwia serializację klasy.
Teraz widzimy, że zmienna o nazwie serialVersionUID jest inicjalizowana jako zmienna Long. Ta liczba jest obliczana przez kompilator na podstawie stanu klasy i atrybutów klasy. Jest to liczba, która pomoże jvm zidentyfikować stan obiektu, gdy odczytuje stan obiektu z pliku.
W tym celu możemy zajrzeć do oficjalnej dokumentacji Oracle:
Jeśli zauważyłeś, istnieje inne słowo kluczowe, którego użyliśmy, które jest przejściowe .
Jeśli pola nie można serializować, należy je oznaczyć jako przejściowe. Tutaj oznaczyliśmy itemCostPrice jako przejściowy i nie chcemy, aby był zapisywany w pliku
Przyjrzyjmy się teraz, jak zapisać stan obiektu w pliku, a następnie odczytać go stamtąd.
Na powyższym możemy zobaczyć przykład serializacji i deserializacji obiektu.
W tym celu użyliśmy dwóch klas. Do serializacji obiektu użyliśmy ObjectOutputStream. Do zapisania obiektu w pliku wykorzystaliśmy metodę writeObject.
Do deserializacji użyliśmy ObjectInputStream, który odczytuje obiekt z pliku. Używa readObject do odczytu danych obiektu z pliku.
Wynik powyższego kodu wyglądałby następująco:
Zwróć uwagę, że itemCostPrice z deserializowanego obiektu ma wartość null, ponieważ nie został zapisany.
źródło
Serializacja obejmuje zapisanie bieżącego stanu obiektu do strumienia i przywrócenie równoważnego obiektu z tego strumienia. Strumień działa jako kontener dla obiektu
źródło
Serializable jest wywoływany jak interfejs, ale bardziej przypomina flagę podsystemu serializacji w czasie wykonywania. Mówi, że ten obiekt można uratować. Wszystkie zmienne instancji Objects, z wyjątkiem żadnych obiektów, które można serializować, i tych oznaczonych jako ulotne, zostaną zapisane.
Wyobraź sobie, że Twoja aplikacja może zmienić kolor jako opcję, bez pozostawiania tego ustawienia na zewnątrz, musisz zmieniać kolor za każdym razem, gdy ją uruchomisz.
źródło
Serializacja to technika przechowywania lub zapisywania obiektów i danych w plikach. Używając
ObjectOutputStream
iFileOutputStream
klas. Te klasy mają swoje specyficzne metody utrwalania obiektów. lubićwriteObject();
dla jasnego wyjaśnienia za pomocą liczb. Zobacz tutaj, aby uzyskać więcej informacji
źródło
Przedstawić z innej perspektywy. Serializacja to rodzaj interfejsu zwanego „interfejsem znaczników”. Interfejs znacznika to interfejs, który nie zawiera deklaracji metod, a jedynie wyznacza (lub „zaznacza”) klasę, która implementuje interfejs jako mający jakąś właściwość. Jeśli rozumiesz polimorfizm, będzie to miało sens. W przypadku interfejsu znacznika Serializable metoda ObjectOutputStream.write (Object) nie powiedzie się, jeśli jej argument nie implementuje interfejsu. To jest potencjalny błąd w Javie, mógł to być ObjectOutputStream.write (Serializable)
Bardzo zalecane: przeczytanie pozycji 37 z książki Effective Java autorstwa Joshua Blocha, aby dowiedzieć się więcej.
źródło
Serializacja: zapis stanu obiektu do pliku / sieci lub gdziekolwiek. (Średni formularz obsługiwanego obiektu Java do formularza obsługiwanego pliku lub formularza obsługiwanego przez sieć)
Deserializacja: odczyt stanu obiektu z pliku / sieci lub z dowolnego miejsca. (Średni plik / format obsługiwany przez sieć do formularza obsługiwanego przez obiekt Java)
źródło
Wystarczy dodać do innych odpowiedzi i w odniesieniu do ogólności. Serializacja jest czasami nazywana archiwizacją, na przykład w Objective-C.
źródło