2013-08-24 12 views
5

W klasie serializacji java Mp3player rozszerza urządzenia ElectronicDevice Serializable w tym kodzie super klasy electronicdevice nie jest zaimplementowany do serializacji. tutaj również super klasa jest seryjnie wysyłana. moje zrozumienie jest super klasy jest również serializowane z powodu rozszerzeń. opowiedz mi, że moje zrozumienie jest poprawne, czy nie.Serializacja Java dla rozszerzonej klasy

import java.io.*; 
class ElectronicDevice { 
     ElectronicDevice() 
     { 
      System.out.print("ed "); 
     } 
    } 
class Mp3player extends ElectronicDevice implements Serializable { 
     Mp3player() 
     { 
      System.out.print("mp "); 
     } 
} 
class MiniPlayer extends Mp3player { 
    MiniPlayer() 
    { 
     System.out.print("mini "); 
    } 
    public static void main(String[] args) { 
      MiniPlayer m = new MiniPlayer(); 
      try { 
       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(); 
      } catch (Exception x) { 
       System.out.print("x "); 
      } 
    } 
    } 
+1

Co to jest kod próbujący dokładnie pokazać? Czego nie rozumiesz w tym, co robi? –

+0

Mechanizm serializacji java zajmuje się tylko instancjami klas implementujących 'Serializable', więc w twoim przypadku pola odziedziczone po' ElectronicDevice' (jeśli jakiekolwiek) nie będą domyślnie serializowane/deserializowane, zobacz [to] (http: // stackoverflow. com/a/7663590/594406) odpowiedź. – Katona

+0

w powyższym kodzie electronicdevice nie jest zaimplementowanym serializowalnym interfejsem, ale w wyniku (po deserializacji) pojawia się również "ed". – rama

Odpowiedz

2

Nie. Podczas procesu serializacji tylko pola obiektów Serializable są zapisywane i odtwarzane.

Według javadocs

Podczas deserializacji, pola klas non-serializować zostanie zainicjowany za pomocą publicznych lub chronione no-Arg konstruktor klasy.

Gdzie pola z serializowalnych podklas zostaną przywrócone ze strumienia.

Proszę spojrzeć na ten przykład
Tutaj ElectronicDevice nie jest Serializable, gdzie jako Mp3player jest Serializable .Należy dziedziny szanowanego klas zachowania w procesie serializacji.

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

Ponieważ super klasa nie implementuje treści Serializable klasy super, nie zostanie zserializowana. Tylko zawartość podklasy byłaby przekształcona do postaci szeregowej. Po deserializacji domyślny konstruktor superklasy zostanie wykonany, a pola klasy nadrzędnej zostaną zainicjowane tak, jakby wywołać domyślny konstruktor.

Poniższy przykład ilustruje to.

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()); 
    } 
} 

Co zostanie wydrukowany jest

johnDow-10 
0

moje rozumienie jest super klasa jest również dostaje odcinkach powodu extends.let mi znać moje rozumienie jest poprawne, czy nie.

Krótka odpowiedź to NO.

W języku java każda klasa jest podklasą Object. Czy Object sam implementuje Serializable?

1

Jest to reguła dla nadklasy serializacji:

Jeżeli jesteś serializacji klasy, ale twój nadklasą NIE serializacji, potem jakieś zmienne instancji można dziedziczyć z tego nadrzędnej zostaną zresetowane do wartości ich zostały podane podczas oryginalnej konstrukcji obiektu. Dzieje się tak dlatego, że uruchomiony zostanie niezdywerowalny konstruktor klasy .

Dlatego, jeśli dodasz niektóre zmienne instancji do ElectronicDevice, pamiętaj, że stan nadklasy nie będzie serializowany. (chyba że nadklasa implementuje Serializable)

Powiązane problemy