Pytania i odpowiedzi dotyczące serializacji Java [dla początkujących i doświadczonych]
Opublikowany: 2020-09-25Java to jeden z lepszych języków programowania na świecie. Mieliśmy szczęście, że Java rozwijała się z biegiem czasu i stała się niezwykle popularnym językiem, jaki znamy dzisiaj. Te ulepszenia, które zostały wprowadzone w Javie, doprowadziły do wprowadzenia kilku naprawdę kluczowych funkcji, które definiują sposób, w jaki dzisiaj piszemy programy. Jedną z tych funkcji jest serializacja.
W swej istocie serializacja jest tylko mechanizmem służącym do przechowywania obiektu w pamięci. Tak więc, kiedy mówimy, że serializujemy obiekt, mamy na myśli, że konwertujemy dany obiekt ze stanu, w którym był, na strumień bajtów. Ta konwersja ze stanu natywnego do strumienia bajtów sprawia, że zapisywanie tego obiektu do pliku jest dziecinnie proste.
Plik ten można następnie przetransportować w dowolne miejsce, a aby uzyskać dostęp do obiektu i jego funkcji, wystarczy, że dokonamy jego deserializacji. Deserializacja, jak sama nazwa wskazuje, jest przeciwieństwem serializacji. Tutaj konwertujemy strumień bajtu na natywny stan obiektu, aby użyć obiektu.
Serializacja umożliwia programistom pisanie kodu z pewnym poziomem elastyczności. Możliwość przejęcia obiektu i używania go z jego natywną właściwością w innym miejscu ma kluczowe znaczenie w dzisiejszym przepływie pracy. Nic dziwnego, że rekruterzy chcą, aby ich potencjalni pracownicy wiedzieli więcej o serializacji obiektów w java.
Niezależnie od tego, czy używałeś serializacji w swoich projektach, czy nie, nie możesz po prostu pozwolić, aby jej znaczenie spadło. Tak więc, aby pomóc Ci w dążeniu do zostania profesjonalnym programistą Java, zebraliśmy kilka fascynujących pytań do wywiadów dotyczących serializacji Java, które znajdziesz poniżej.
Pytania do wywiadu na temat serializacji Java
Q1. Co rozumiesz przez serializację w kontekście języka programowania Java?

Odp. Definicja serializacji jest prawdopodobnie najbardziej podstawowym, ale jednym z najczęściej zadawanych pytań w kontekście serializacji Java. Będziesz musiał odpowiedzieć na to pytanie prawie we wszystkich wywiadach. Dlatego musisz mieć zaszczepioną dobrą definicję serializacji Javy. Tak więc serializacja to nic innego jak sposób, w jaki obiekt napisany w Javie jest konwertowany na strumień bajtów.
Głównym celem jest umożliwienie przeniesienia obiektu na inny komputer lub zapisanie stanu obiektu do pliku lub zapisanie stanu obiektu w bazie danych. Gdy obiekt zostanie pomyślnie zserializowany, możemy szybko odzyskać obiekt z powrotem do jego dawnej świetności, po prostu deserializując obiekt.
Q2. W jaki sposób możemy serializować obiekt w Javie? Napisz program do serializacji i deserializacji obiektu.
Odp. Podczas rozmowy kwalifikacyjnej, jeśli jesteś w stanie poszerzyć swoją wiedzę teoretyczną o umiejętność napisania programu, szanse na Twój wybór automatycznie wzrosną. Podano również, że w każdym wywiadzie będziesz miał za zadanie napisać podstawowy program (przynajmniej podstawowy program), który pokazuje, jak przebiega serializacja i deserializacja. Zanim sam napiszesz ten program, musisz pamiętać o jednej kluczowej rzeczy dotyczącej serializacji obiektów w javie.
Aby serializować obiekt, musisz napisać obiekt, który używa interfejsu klasy java.io.Serializable. Musisz upewnić się, że używasz interfejsu Marker dla obiektu klasy, który chcesz serializować. Oznacza to, że klasa, o której mowa, nie powinna mieć żadnych pisanych metod w klasie. Ta klasa musi również poinformować wirtualną maszynę Javy, że powstały obiekt będzie musiał zmienić formy i ukształtować strumień bajtów.
Kod serializacji jest napisany poniżej.
OutputStream fout = new FileOutputStream("ser.txt");
ObjectOutput outout = new ObjectOutputStream(fout);
System. out .println("Rozpoczęto proces serializacji, serializacja obiektów pracowników...");
out.writeObject(obiekt1);
Kod do deserializacji jest napisany poniżej.
InputStream fin= new FileInputStream(„ser.txt”);
ObjectInput oin= new ObjectInputStream(fin);
System. out .println("Rozpoczął się proces deserializacji, wyświetlanie obiektów pracowników...");
pracownik em;
emp=(Pracownik) oin.readObject();
Dowiedz się: Przydział pamięci w Javie: wszystko, co musisz wiedzieć
Q3. Jaka jest różnica między interfejsami Serializacji i Externalizable?
Odp. To pytanie może oznaczać różnicę, czy zostaniesz wybrany do pracy, czy nie. Załóżmy, że potrafisz odpowiedzieć na to pytanie w bardzo wyczerpujący sposób. W takim przypadku osoba prowadząca rozmowę kwalifikacyjną z pewnością będzie pod wrażeniem Twojej wiedzy na ten temat, a szanse Twojego wyboru na stanowisko automatycznie wzrosną. Wszystkie krytyczne różnice znajdziesz w poniższej tabeli:
Właściwości, na których porównujemy obie te metody. | SERIALIZOWANY | MOŻLIWOŚĆ ZEWNĘTRZNA |
Metody, które są obecne w klasach tych dwóch różnych interfejsów | Tak się składa, że jest to interfejs znacznika. Interfejsy znaczników nie mogą mieć żadnych funkcji członkowskich. Muszą być puste, z wyjątkiem tego, że muszą zawierać instrukcję, która mówi wirtualnej maszynie Javy, że obiekt tej klasy musi zostać przekonwertowany na strumień bajtów. | To nie jest interfejs kreatora, co oznacza, że ma kilka metod członkowskich. Ma metody o nazwie writeExternal() i readExternal() |
Jaki jest ich domyślny sposób serializacji? | Dla serializable znajdziesz domyślny sposób, w jaki możesz serializować obiekty, które piszesz. Jedyne, co musiałbyś zrobić jako programista, to znaleźć sposób, w jaki możesz zintegrować ten interfejs ze swoim programem. | Nie znajdziesz domyślnego sposobu implementacji serializacji. Będziesz musiał napisać własne metody lub zastąpić istniejące. |
W jaki sposób realizują proces serializacji? | Możesz dostosować sposób implementacji serializacji w tym interfejsie. Nie możesz jednak zastąpić istniejących metod. Będziesz musiał zaimplementować te metody we własnej klasie, aby uzyskać pożądany stopień swobody. | W tej metodzie będziesz musiał zastąpić metody domyślne. Jeśli więc chcesz zaimplementować niestandardowy sposób serializacji obiektu, powinieneś wybrać ten interfejs zamiast domyślnego sposobu Serializable. |
Jaki stopień kontroli oferują w procesie serializacji, | Podczas korzystania z tego interfejsu znajdziesz mały pokój do poruszania się. Aby jak najlepiej wykorzystać tę metodę, musisz także zapisać domyślne funkcje w swojej klasie. Jednak nie jest to obowiązkowe, co oznacza, że nadal będziesz mógł serializować obiekty za pomocą tego interfejsu bez zapisywania funkcji domyślnych w swojej klasie niestandardowej. | Ten interfejs zapewnia doskonałą kontrolę nad całym procesem. Tylko z tego powodu, jeśli używasz tego interfejsu, konieczne będzie zapisanie tych dwóch metod w swojej niestandardowej klasie. |
Jaki jest konstruktor używany podczas deserializacji, | Nie ma konstruktora, który jest wywoływany podczas procesu serializacji. | Podczas serializacji obiektów przy użyciu tego interfejsu następuje wywołanie wykonawcy. |
Q4. Napisz program, w którym zaimplementujesz niestandardowy proces serializacji i deserializacji.

Odp. Nadchodzi trudna część. To jest pytanie, przez które możesz pokazać całą wiedzę z poprzedniego pytania poprzez praktyczny scenariusz przypadku użycia. Umiejętność pisania tych programów wyraźnie zademonstruje Twoją wiedzę i pomoże Ci w zdobyciu wymarzonej pracy.
Napisany poniżej znajdziesz niestandardowy sposób napisania metody writeObject().
private void writeObject(ObjectOutputStream os) {
System. out .println(„In, metoda writeObject().”);
spróbuj {
os.writeInt( ten .id);
os.writeObject( ta nazwa);
} połów (wyjątek e) {
e.printStackTrace();
}
}
Napisane poniżej znajdziesz niestandardową implementację deserliasacji.
private void readObject(ObjectInputStream ois) {
System. out .println(„In, metoda readObject().”);
spróbuj {
id=ois.odczytInt();
name=(String)ois.readObject();
} połów (wyjątek e) {
e.printStackTrace();
}
}
P5. Jak zaimplementujesz serializację i deserializację przy użyciu interfejsu Externalizable?
Odp. Aby zaimplementować serializację i deserializację przy użyciu interfejsu, który można uzewnętrznić, będziesz musiał samodzielnie napisać funkcję writeExternal() i readExternal(). Kod dla obu znajdziesz poniżej.
Dostosowywanie metody writeExternal()
publiczny próżnia writeExternal (ObjectOutput oo) wyrzuca IOException {
System. out .println(„w writeExternal()”);
oo.writeInt(id);
oo.writeObject(nazwa);
}
Dostosowywanie metody readExternal()
publiczny próżnia readExternal (ObjectInput in) wyrzuca IOException, ClassNotFoundException {
System. out .println(„w readExternal()”);
to .id=in.readInt();
this .name=(String)in.readObject();
}
Przeczytaj o: Python vs Java w 2020 roku: który wybrać?
P6. Powiedzmy, że nie chcesz serializacji określonej zmiennej. Co zrobisz, aby zapobiec zmiennym składowym, których nie chcesz serializować?
Odp. To bardzo konceptualne pytanie. Aby szybko odpowiedzieć na to pytanie, musisz znać zmienne statyczne i niestatyczne. Załóżmy, że chcesz, aby konkretna zmienna nie była serializowana. W takim przypadku będziesz musiał uczynić je statycznymi, ponieważ wartość dowolnej zmiennej statycznej nie może zostać zmieniona, a zatem z tego powodu nie zostaną one również zserializowane.
P7. Co masz na myśli przez serialVersionUID?
Odp. Dla każdej klasy, którą chcemy zserializować, otrzymamy numer klasy. Ten numer, nadawany każdej klasie, która ma być serializowana, nazywa się serialVersionUID. Ten identyfikator jest niezbędny, ponieważ w momencie odzyskania obiektu w jego natywnej formie wirtualna maszyna Javy szuka identyfikatora, który jest powiązany z obiektem.
Następnie szybko odwołuje się do identyfikatora klas, które miały być serializowane. Po znalezieniu odpowiedniej klasy, do której należy ten obiekt, rozpoczyna się proces deserializacji.
P8. Powiedzmy, że zapomnieliśmy wspomnieć lub zdefiniować serialVersionUID. Jaki będzie wpływ tej akcji na program, który napisaliśmy?
Odp. To pytanie jest kolejnym fundamentalnym pytaniem. Aby poprawnie odpowiedzieć na to pytanie, potrzebujesz solidnej wiedzy. Pierwszą rzeczą, którą musimy wyjaśnić, jest to, że serialVersionUID służy do kontroli wersji obiektu w pytaniu. Powiedzmy, że nie ma zdefiniowanego identyfikatora dla klasy, więc kompilator Javy nie będzie wiedział, do której klasy należy obiekt. W czasie wykonywania lub podczas serializacji obiektu nie wystąpią żadne błędy, ponieważ nie ma potrzeby definiowania żadnego identyfikatora.

Jednak gdy chcemy, aby strumień danych został przekonwertowany na obiekt, kompilator Javy zgłosi błąd. Kompilator nie będzie wiedział, do której klasy należy obiekt, przez co nie będzie w stanie znaleźć i połączyć wszystkich funkcji składowych i zmiennych, które są powiązane z tym obiektem. Ponieważ kompilator utknie w tym kroku, zgłosi błąd niezgodności serialVersionUID (java.io.InvalidClassException).
P9. W przypadku, gdy nie możemy serializować lub metoda serializacji jest niedostępna, czy jest jakaś inna metoda, dzięki której bylibyśmy w stanie przesłać obiekt, który napisaliśmy przez sieć?
Odp. Jest kilka metod, dzięki którym moglibyśmy przenieść obiekt, który napisaliśmy przez sieć. Niektóre z nich znajdziesz poniżej.
- Możesz spróbować przekonwertować obiekt na plik JSON. Konwersja obiektu do ciągu JSON nie jest trudna, a po zapisaniu pliku JSON konwersja do pliku kodu również nie jest bardzo trudna. Możesz więc przesłać ciąg JSON, który napisałeś przez sieć.
- Możesz także użyć narzędzia Hibernacja (jest to narzędzie ORM). To narzędzie umożliwia zachowanie obiektu w bazie danych. Wtedy pisany obiekt może być później bardzo łatwo odczytany.
- Możesz także skorzystać z technologii XML. Możesz spróbować przekonwertować obiekt do pliku XML, a następnie szybko przesłać ten plik przez sieć.
Musisz przeczytać: 24 najważniejsze pytania i odpowiedzi dotyczące wywiadu w języku Java
Zawijanie
Jeśli chcesz dowiedzieć się więcej o Javie, programach OOP i tworzeniu pełnego stosu oprogramowania, zapoznaj się z dyplomem PG upGrad i IIIT-B w zakresie pełnego tworzenia oprogramowania, który jest przeznaczony dla pracujących profesjonalistów i oferuje ponad 500 godzin rygorystycznego szkolenia, 9 + projekty i zadania, status absolwentów IIIT-B, praktyczne praktyczne projekty zwieńczenia i pomoc w pracy z najlepszymi firmami.