2013-04-02 17 views
5

W wywiadzie było poprosić, że istnieje klasa A który nie implementuje interfejsu serializable jak pokazano poniżejserializacji między podklasy

class A 
{ 
    private int a; 

    A(int a) 
    { 
     this.a = a; 
    } 
} 

i istnieje klasa B która rozciąga A a także implementuje interfejs serializable

class B extends A implements serializable 
{ 

    private int a , b; 

    B(int a, int b) 
    { 
     this.a = a; 
     this.b = b; 
    } 
} 

teraz prosimy o poinformowanie, czy mogę serializacji klasy B czy nie, pod warunkiem, że nie jest klasy A odcinkach supp ose Chcę serializować obiekt klasy B, można to zrobić.

+3

krótka odpowiedź. Tak, można to zrobić: –

+0

@ rai.skumar Dzięki, ale powiedzmy, że jeśli serializuje obiekt klasy B, to wtedy, gdy go zranić, co by się stało, czy zostanie uruchomiony konstruktor klasy B, a co z klasą A, wtedy –

+0

Deserializacja nie zadzwoń do konstruktora. Tworzy obiekt całkowicie z zakodowanego strumienia. –

Odpowiedz

4

Nie można serializować B bez modyfikowania A, aby uzyskać konstruktor bez argumentów.

Z javadoc z java.io.Serializable

aby umożliwić podtypy klasy non-serializable być szeregowane, podtyp może przejąć odpowiedzialność za zapisywanie i przywracanie stanu z publicznej wiadomości supertypem za chronione, oraz (jeśli dostępny) pakiety pól. Podtyp ten może przyjąć tę odpowiedzialność tylko wtedy, gdy klasa rozszerza się o dostępny konstruktor no-arg w celu zainicjowania stanu klasy . Jest to błąd w zadeklarowaniu klasy Serializable, jeśli to nie jest tak . Błąd zostanie wykryty w czasie wykonywania.

Podczas deserializacji, pola klas non-serializować będzie zainicjowany za pomocą publicznych lub chronione no-Arg konstruktor klasy . Konstruktor no-arg musi być dostępny dla podklasy, która jest przekształcana do postaci szeregowej, która jest .

+0

, więc musimy najpierw dostarczyć konstruktor domyślny do klasy A. –

4

Teraz prosimy o poinformowanie, czy mogę serializacji klasy B, czy nie, pod warunkiem, że klasa A nie jest w odcinkach

Tak.

Każda klasa, która implementuje Serializable, może zostać przekształcona do postaci szeregowej. nawet jeśli jest to klasa podstawowa, nie implementuje go.

Wszystkie klasy rozszerzają zakres Object, który nie jest możliwy do serializacji, ale nadal jego podklasy mogą być przekształcane do postaci szeregowej przez implementację Serializable.

+0

, ale co z relacją, powiedzmy, jeśli klasa b ma odniesienie klasy A. –

+0

Obiekt, który wskazuje, nie będzie serializowany. – Azodious

+1

'Obiekt' zapewnia konstruktor bez argumentów, bez niego nie działałby. – dcernahoschi

0

Oczywiście .. Tutaj możemy szeregować tylko klasę B. Ale nie A ponieważ nie jest zaimplementowany interfejs szeregowania.

Serializacja nie stanowi problemu. Ale podczas de-serializacji pojawia się tylko błąd runtime.

+0

Jaki jest cel serializacji bez nigdy deserializacji? – dcernahoschi

+0

@dcernahoschi Jak zostało zadane pytanie, Moja odpowiedź w tym kontekście ma zastosowanie. to, co powiedziałeś, jest poprawne. –

1

Tak, możesz, ponieważ twoja klasa implementuje interfejs szeregowy, który wystarczy, aby twoja klasa B była serializowana.

1

Tak; możesz serializować klasę B niezależnie od klasy A.

Edit:

class A{ 
int a; 
A(int t){ 
    a =t; 
} 
A(){} //default constructor is must 
} 

class B extends A implements Serializable{ 
String b; 
B(int t, String u){ 
    super(t); 
    b=u; 
} 
} 

public class SOSerialization { 
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { 
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("test.ser")); 
    B b = new B(1, "tmp"); 
    os.writeObject(b); 
    os.close(); 

    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.ser")); 

    Object o = ois.readObject(); 
    ois.close(); 
    B bb = (B)o; 
    System.out.println(" values :"+ bb.a + " "+ bb.b); 
} 
} 

Więc trzeba dostarczyć domyślnego konstruktora, jeśli chcesz zrobić deserializacji pomyślnie.

Ouptput:

wartości: 0 TMP

więc robi domyślną wartość atrybutów klasy super.

0

Oczywiście można serializować klasę B, ponieważ implementuje interfejs Serializable.

-nasza klasa implementująca interfejs Serializowalny może być serializowana.

Nie ma znaczenia, że ​​klasa bazowa ma numer seryjny lub nie.

-Jeśli klasa bazowa nadaje się do Serializacji, wówczas podklasę można również szeregować szeregowo.

-Jeśli obiekt jest serializowany, to cały wykres obiektu zostanie przekształcony do postaci szeregowej. Wszystkie obiekty przywoływane przez zmienne instancji, patrząc przez obiekt serializowany.