2012-04-09 14 views
12

Czy możemy serializować statyczną klasę wewnętrzną w Javie? Sama klasa jest tutaj zadeklarowana jako statyczna.Serializacja statycznej klasy wewnętrznej

+12

Cóż, co się stanie, gdy ... spróbujesz? –

+1

Moja aplikacja działa poprawnie, gdy to robię. Ale, aby tak się stało, dokonuję serializacji klas wewnętrznych i zewnętrznych, co nie jest mi potrzebne, ale znam pojęcie, jeśli klasa wewnętrzna jest seryjna, to zewnętrzna musi być poddana szeregowaniu. A także, mam pewne wątpliwości w statycznych klasach można serializować, czy też nie. – Tinkerbel

+0

Zewnętrzna klasa nie ma nic wspólnego z serializacją _statycznej_ klasy wewnętrznej. –

Odpowiedz

18

Statyczna klasa wewnętrzna nie różni się od klasy najwyższego poziomu pod tym względem: może być serializowana, jeśli deklarowana jest implementacja Serializable (lub jest podklasą klasy zadeklarowanej jako implementująca Serializable). Podobnie jak w przypadku klas najwyższego poziomu, wszystkie obiekty napotkane podczas serializacji w czasie wykonywania muszą być przekształcane do postaci szeregowej, aby uniknąć NotSerializableException. Ponieważ klasa wewnętrzna to static, natura klasy zewnętrznej nie ma tu znaczenia.

+1

Dziękuję wszystkim. Dostałem to, czego potrzebowałem od was, ludzie. – Tinkerbel

0

Wygląda na to, że odpowiedź może się różnić w zależności od wersji Java.

Spec serializacji w JDK 7 mówi:

Uwaga - serializacji klas wewnętrznych (tj zagnieżdżonych klas, które nie są statyczne klasy członek), w tym klas lokalnych i anonimowych, jest odradzane z kilku powodów. Ponieważ klasy wewnętrzne zadeklarowane w niestatycznych kontekstach zawierają niejawne nie-przejściowe odwołania do otaczających instancji klasy, serializacja takiej instancji klasy wewnętrznej spowoduje również serializację powiązanej z nią instancji klasy zewnętrznej. Pola syntetyczne generowane przez javac (lub inne kompilatory JavaTM) w celu implementacji klas wewnętrznych są zależne od implementacji i mogą się różnić między kompilatorami; różnice w takich polach mogą zakłócać kompatybilność, a także powodować konflikt domyślnych wartości serialVersionUID. Nazwy przypisane do lokalnych i anonimowych klas wewnętrznych są również zależne od implementacji i mogą się różnić między kompilatorami. Ponieważ klasy wewnętrzne nie mogą zadeklarować elementów statycznych innych niż stałe w czasie kompilacji, nie mogą używać mechanizmu serialPersistentFields do wyznaczania serializowalnych pól. Na koniec, ponieważ klasy wewnętrzne powiązane z instancjami zewnętrznymi nie mają konstruktorów o zerowym argumencie (konstruktorzy takich klas wewnętrznych domyślnie akceptują instancję otaczającą jako parametr z góry), nie mogą implementować funkcji Externalizable. Żaden z wyżej wymienionych problemów nie dotyczy klas statycznych członków.

oraz z serializacji seryjnej obiektów między wersjami Oracle i IBM JDK 1.7, mogę powiedzieć, że nie zawsze działa. Nie mogę powiedzieć na pewno, że zawsze zawodzi, ale na pewno nie można na nim liczyć.

Ścieżka kodowa, która nie zawodzi w mojej aplikacji, działała prawidłowo na JDK 1.5 przez 5 lat w produkcji i nie widzę żadnej z poprzednich wersji dokumentacji na temat serializacji przypominającej bieżące oświadczenie. Tak więc wydaje się, że bogowie Java nie dopuszcza do tego wzorca kodu w JDK 7.

+3

Nie dotyczy to pytania, które określa ** statyczne ** klasy wewnętrzne. – gerardw

1

@Tinkerbel coś Uwaga -

Szeregowania statycznych klas zagnieżdżonych jest w porządku, ale kiedy (w przyszłości) jeśli statyczne klasy wewnętrzne są coraz przeniesiony do innej klasy zewnętrznej, a następnie serializowanie starych obiektów jest problemem.

Wszystkie pola są przypisane jako domyślne/puste.

+0

Będzie pomocne, jeśli ktoś może wyjaśnić, dlaczego?Zauważyłem to, ale nie mam bardzo przekonującego powodu ... Brzmi to tak, jak tylko zmieni się pakiet, tak powinno się stać – user2674407

Powiązane problemy