2013-08-24 3 views
5

В классе сериализации Java Mp3player расширяет возможности ElectronicDevice. Сериализуемый в этом коде электронный класс суперкласса не реализуется сериализуемым. здесь суперкласс также становится сериализованным. мое понимание супер класс также сериализуется из-за extends.let мне известно, что мое понимание правильное или нет.Java-сериализация для расширенного класса

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

Что такое код, который пытается точно показать? Что вы не понимаете в том, что он делает? –

+0

Механизм сериализации java берет только экземпляры классов, реализующих 'Serializable', поэтому в вашем случае поля, унаследованные от' ElectronicDevice' (если есть), по умолчанию не будут сериализованы/десериализованы, см. [This] (http: // stackoverflow. com/a/7663590/594406) ответ. – Katona

+0

в приведенном выше коде электронное устройство не реализовано сериализуемым интерфейсом, но в результате (после десериализации) в выход также входит «ed». – rama

ответ

2

№ При проведении сериализации выписываются и восстанавливаются только поля объектов, подлежащих сериализации.

Согласно javadocs

Во время десериализации поля несериализуемых классов будут инициализированы с помощью общественности или защищенный конструктор без аргументов класса.

Где, как поля сериализуемых подклассов будут восстановлены из потока.

Пожалуйста, смотрите в этом примере
Здесь ElectronicDevice не Serializable, где, как Mp3player является Serializable .Принимать поля уважаемой поведения классов в процессе сериализации.

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

Поскольку суперкласс не реализует Сериализуемое содержимое суперкласса не будет сериализованным. Только содержимое подкласса получило бы сериализацию. Когда вы выполните десериализацию, конструктор по умолчанию суперкласса будет выполнен, а поля суперкласса будут инициализированы так, как если бы вы вызывали конструктор по умолчанию.

Следующий пример иллюстрирует это.

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

Что распечатана является

johnDow-10 
0

мое понимание супер класс также получает сериализовать благодаря extends.let я знаю, что мое понимание правильно или нет.

Короткий ответ NO.

В java каждый класс является подклассом Object. Выполняет ли ObjectSerializable?

1

Это правило для суперкласса серийности:

Если вы сериализации класс, но ваш суперкласс НЕ сериализуемые, то любые переменные экземпляра вы унаследовали от этого суперкласса будут сброшены к значениям, которые они были даны во время первоначальной конструкции объекта . Это связано с тем, что конструктор класса nonconializable будет запущен.

Следовательно, если вы добавите некоторые переменные экземпляра в ElectronicDevice, имейте в виду, что состояние суперкласса не будет сериализовано. (если суперкласс не использует Serializable)

0

Чтобы подтипы несериализуемых классов для сериализации, подтип может взять на себя ответственность за сохранение и восстановление состояния общественности супертипе, в защите, и (если доступно) полей пакета»

Reference - http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

Смежные вопросы