2013-08-24 14 views
5

Nella classe di serializzazione java Mp3player estende le implementazioni di ElectronicDevice Serializable in questo codice electronicdevice super classe non implementato serializzabile. qui anche la super classe viene serializzata. la mia comprensione è che anche la super classe viene serializzata a causa di extends.let me so che la mia comprensione è corretta o meno.Serializzazione Java per Extended Class

+1

Qual è il codice che tenta di mostrare esattamente? Cosa non capisci in quello che fa? –

+0

Il meccanismo di serializzazione java si occupa solo delle istanze di classi che implementano 'Serializable', quindi nel tuo caso, i campi ereditati da' ElectronicDevice' (se presenti) non verranno serializzati/deserializzati per impostazione predefinita, vedere [this] (http: // stackoverflow. it/a/7663590/594406) risposta. – Katona

+0

nel suddetto codice electronicdevice non è implementato nell'interfaccia serializzabile ma nel risultato (dopo la deserializzazione) "ed" sta arrivando anche nell'output. – rama

risposta

2

No. Durante il processo di serializzazione solo i campi di oggetti serializzabili vengono scritti e ripristinati.

Secondo javadocs

durante la deserializzazione, i campi di classi non serializzabili sarà inizializzato con il pubblico o protetto no-arg costruttore della classe.

Dove i campi delle sottoclassi serializzabili verranno ripristinati dallo stream.

Si prega di guardare in questo esempio
Qui ElectronicDevice non è Serializable, dove, come è Mp3playerSerializable .Observe nel campo del comportamento classi rispettata nel processo di serializzazione.

import java.io.*; 
class ElectronicDevice { 
    public int i = 0; 
    protected ElectronicDevice() 
    { 
     System.out.println("ed "); 
    } 
} 
class Mp3player extends ElectronicDevice implements Serializable { 
    int j =0; 
    Mp3player() 
    { 
     System.out.println("mp "); 
    } 
} 
class MiniPlayer extends Mp3player { 
    MiniPlayer() 
    { 
     System.out.println("mini "); 
    } 
public static void main(String[] args) { 
     MiniPlayer m = new MiniPlayer(); 
     m.i = 30; 
     m.j = 40; 
     try { 
      System.out.println("i value before serialization: "+m.i);//prints 30 
      System.out.println("i value before serialization: "+m.j);//prints 40 
      FileOutputStream fos = new FileOutputStream("dev.txt"); 
      ObjectOutputStream os = new ObjectOutputStream(fos); 
      os.writeObject(m); os.close(); 

      FileInputStream fis = new FileInputStream("dev.txt"); 
      ObjectInputStream is = new ObjectInputStream(fis); 
      MiniPlayer m2 = (MiniPlayer) is.readObject(); 
      is.close(); 
      System.out.println("i value after serialization: "+m2.i);//prints o 
      System.out.println("j value after serialization: "+m2.j);//prints 40 
      System.out.println(); 
     } catch (Exception x) { 
      x.printStackTrace(); 
      System.out.print("x "); 
     } 
    } 
} 
4

Poiché la super classe non implementa i contenuti serializzabili della super classe non verranno serializzati. Solo i contenuti della sottoclasse verrebbero serializzati. Quando si deserializza, il costruttore predefinito della superclasse viene eseguito e i campi della superclasse vengono inizializzati come se si invocasse il costruttore predefinito.

L'esempio seguente illustra questo.

public class SerializationTest { 

    public static class Base { 
     private String name; 

     public Base() { 
      this.name = "johnDow"; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 
    } 

    public static class Sub extends Base implements Serializable { 
     private static final long serialVersionUID = 1L; 
     private String age; 

     public String getAge() { 
      return age; 
     } 

     public void setAge(String age) { 
      this.age = age; 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream(); 
     ObjectOutputStream out = new ObjectOutputStream(byteArrayOS); 
     Sub s = new Sub(); 
     s.setName("name"); 
     s.setAge("10"); 
     out.writeObject(s); 
     ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(byteArrayOS.toByteArray())); 
     Sub d = (Sub) ois.readObject(); 
     System.out.println(d.getName() + "-" + d.getAge()); 
    } 
} 

Che cosa viene stampato è

johnDow-10 
0

la mia comprensione è super classe è anche viene serializzato a causa di extends.let farmi sapere la mia comprensione è corretta o meno.

La risposta breve è NO.

In java, ogni classe è una sottoclasse di Object. Lo stesso Object implementa Serializable?

1

Questa è la regola per la serializzazione superclasse:

Se sei una classe serializzabile, ma il vostro superclasse non è serializzabili, poi eventuali variabili di istanza si eredita da quella superclasse saranno riportati ai valori che sono stati dati durante la costruzione originale dell'oggetto . Questo perché verrà eseguito il costruttore della classe non serializzabile .

Pertanto, se si aggiungono alcune variabili d'istanza a ElectronicDevice, essere consapevoli del fatto che lo stato d' superclasse non verrà serializzato. (a meno che la superclasse implementi serializzabile)