2015-07-14 38 views
9

wiem co jest serializacji i dlaczego jest on używany, ale moje pytanie:Dlaczego interfejs Serializable nie zawiera żadnych metod?

  1. Dlaczego serializacji interfejs marker?
  2. Jaka jest potencjalna korzyść wynikająca z braku konieczności korzystania z interfejsu Serializable, ponieważ w przypadku serializacji możemy w ogóle nadpisać te 2 metody?
  3. W jaki sposób readResolve zapewnia, że ​​obiekt utworzony podczas deserializacji nie jest nowym obiektem. Znam poniższy i zwraca ten sam obiekt podczas deserializacji, ale kto będzie wewnętrznie nazwać tę metodę readResolve?

    private Object readResolve() throws java.io.ObjectStreamException { 
        return INSTANCE; 
    } 
    
+3

* ponieważ kiedy dokonujemy serializacji, w końcu nadpisujemy te 2 metody? *: Nie, nie robisz. * Kto wywoła tę metodę readResolve wewnętrznie? *: ObjectInputStream (lub jedną z używanych przez nią klas), która służy do deserializacji obiektów. –

+0

Poszczególne interfejsy nie mogą określać prywatnych metod. – immibis

+0

@ gronostaj: Wierzę, że ten link nie odpowiada na wszystkie moje pytania. – Lathy

Odpowiedz

10
  1. Ponieważ nie musi być jakiś wyraźny sposób deklarowania klasy jako możliwy do serializacji. Struktura nie może po prostu założyć, że wszystkie klasy mają możliwość serializacji, ponieważ istnieje wiele rodzajów obiektów, które przestaną działać, jeśli ich pola zostaną zapisane na dysku i później zostaną załadowane z tego miejsca (np. FileInputStream, które opiera się na otwartym uchwycie pliku systemu operacyjnego który może już nie istnieć, gdy obiekt jest deserializowany). Współczesny sposób posiadania takiej deklaracji byłby adnotacją, ale nie istniały one w Javie w czasie, gdy dodawano do niej serializację.
  2. Nie musisz ich zastępować - jeśli domyślne zachowanie serializera jest wystarczająco dobre; nie musisz robić niczego poza zaimplementowaniem Serializable.
  3. The serialization framework calls it when an object has been completely deserialized. W tym momencie obiekt może przeglądać swoją zawartość, a jeśli zdecyduje, że zamiast tego powinien być reprezentowany przez inną instancję, może zwrócić tę instancję zamiast niej (jeśli nie, zwraca this). Wszystko, co wychodzi z tej metody, jest zwracane do kodu, który zażądał deserializacji. Jeśli wcześniejszy obiekt został zwrócony, nowy obiekt utworzony przez deserializer nie będzie przez nikogo widoczny i ostatecznie zostanie zebrany jako śmieci.
+0

Witam Aasmundzie, dziękuję za komentarze. Czy możesz wyjaśnić szczegółowo swój punkt 1? – Lathy

+0

@Lathy: Jaka jest jego część? –

+0

"Nie można po prostu założyć, że wszystkie klasy mogą być przekształcalne do postaci szeregowej." – Lathy

2

Interfejsy znaczników służą do informowania JVM o wykonywaniu określonych zadań. nie mają żadnej metody. Serializable to także interfejs znaczników.

Serializacja to proces spłaszczania obiektów. kiedy implementujesz interfejs szeregowalny w klasie, mówi on JVM, aby serializować jego obiekt, tj. musi być przekonwertowany na strumień.

Powiązane problemy