首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展类的Java序列化

扩展类的Java序列化
EN

Stack Overflow用户
提问于 2013-08-24 10:49:30
回答 5查看 19.2K关注 0票数 11

在java序列化类中,Mp3player扩展ElectronicDevice实现了本代码中的可序列化,超类电子设备不是可序列化的。在这里,超类也会被序列化。我的理解是超类也因为extends.let而被序列化,我知道我的理解是否正确。

代码语言:javascript
复制
 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 "); 
          }
     }
  }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-24 11:54:49

No.During序列化过程,只有可序列化对象的字段才会被写入和还原。

根据javadocs

在反序列化过程中,非序列化类的字段将使用类的公共或受保护的non构造函数初始化。 其中,可序列化子类的字段将从流中还原。

请看一下这个例子

这里,ElectronicDevice不是Serializable,与Mp3player一样,Serializable.Observe是序列化过程中受人尊敬的类行为的字段。

代码语言:javascript
复制
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 "); 
       }
   }
 }
票数 7
EN

Stack Overflow用户

发布于 2013-08-24 11:44:27

由于超类没有实现可序列化的内容,所以超类的内容不会被序列化。只有子类的内容才会被序列化。当您反序列化超类的默认构造函数时,将执行超类的默认构造函数,并初始化超类的字段,就像调用默认构造函数一样。

下面的示例说明了这一点。

代码语言:javascript
复制
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());
    }
}

印出来的是

代码语言:javascript
复制
johnDow-10
票数 5
EN

Stack Overflow用户

发布于 2013-08-24 11:52:11

这是超类序列化的规则:

如果您是一个可序列化的类,但是您的超类是不可序列化的,那么您从该超类继承的任何实例变量都将重置为在对象的原始构造过程中给出的值。这是因为不可序列化的类构造函数将运行。

因此,如果向ElectronicDevice添加了一些实例变量,请注意超类的状态不会被序列化。(除非超类实现了可序列化)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18417737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档