Java 面向对象/Java 继承

Java中带继承的对象序列化

序列化是一种将对象状态转换为字节流的机制。反序列化是相反的过程,其中字节流用于在内存中重新创建实际的Java对象。

有一些关于继承的序列化情况:

情况1:如果超类是可序列化的,那么子类是可自动序列化的:如果超类是可序列化的,那么默认情况下每个子类都是可序列化的。因此,即使子类没有实现Serializable接口(如果它的超类实现了Serializable),那么我们也可以序列化子类对象。

// Java program to demonstrate

// that if superclass is

// serializable then subclass

// is automatically serializable

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

// superclass A

// implementing Serializable interface

class A implements Serializable

{

int i;

// parameterized constructor

public A(int i)

{

this.i = i;

}

}

// subclass B

// B class doesn't implement Serializable

// interface.

class B extends A

{

int j;

// parameterized constructor

public B(int i, int j)

{

super(i);

this.j = j;

}

}

// Driver class

public class Test

{

public static void main(String[] args)

throws Exception

{

B b1 = new B(10,20);

System.out.println("i = " + b1.i);

System.out.println("j = " + b1.j);

/* Serializing B's(subclass) object */

//Saving of object in a file

FileOutputStream fos = new FileOutputStream("abc.ser");

ObjectOutputStream oos = new ObjectOutputStream(fos);

// Method for serialization of B's class object

oos.writeObject(b1);

// closing streams

oos.close();

fos.close();

System.out.println("Object has been serialized");

/* De-Serializing B's(subclass) object */

// Reading the object from a file

FileInputStream fis = new FileInputStream("abc.ser");

ObjectInputStream ois = new ObjectInputStream(fis);

// Method for de-serialization of B's class object

B b2 = (B)ois.readObject();

// closing streams

ois.close();

fis.close();

System.out.println("Object has been deserialized");

System.out.println("i = " + b2.i);

System.out.println("j = " + b2.j);

}

}

输出:

i = 10

j = 20

Object has been serialized

Object has been deserialized

i = 10

j = 20

如果超类不是可序列化的,那么子类仍然可以被序列化:即使超类没有实现Serializable接口,如果子类本身实现了Serializable接口,我们也可以序列化子类对象。所以我们可以说为了序列化子类对象,超类不需要可序列化。但是在这种情况下,序列化过程中超类的实例会发生什么。以下过程解释了这一点。

当一个类是可序列化的,但它的超类不是时会发生什么?

序列化:在序列化时,如果任何实例变量继承自不可序列化的超类,那么JVM将忽略该实例变量的原始值并将缺省值保存到文件中。

反序列化:在反序列化时,如果存在任何不可序列化的超类,那么JVM将在超类中执行实例控制流。为了在类中执行实例控制流,JVM将始终调用该类的默认(无参数)构造函数。所以每个不可序列化的超类必须包含默认的构造函数,否则我们会得到运行时异常。

// Java program to demonstrate

// the case if superclass need

// not to be serializable

// while serializing subclass

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;;

// superclass A

// A class doesn't implement Serializable

// interface.

class A

{

int i;

// parameterized constructor

public A(int i)

{

this.i = i;

}

// default constructor

// this constructor must be present

// otherwise we will get runtime exception

public A()

{

i = 50;

System.out.println("A's class constructor called");

}

}

// subclass B

// implementing Serializable interface

class B extends A implements Serializable

{

int j;

// parameterized constructor

public B(int i,int j)

{

super(i);

this.j = j;

}

}

// Driver class

public class Test

{

public static void main(String[] args)

throws Exception

{

B b1 = new B(10,20);

System.out.println("i = " + b1.i);

System.out.println("j = " + b1.j);

// Serializing B's(subclass) object

//Saving of object in a file

FileOutputStream fos = new FileOutputStream("abc.ser");

ObjectOutputStream oos = new ObjectOutputStream(fos);

// Method for serialization of B's class object

oos.writeObject(b1);

// closing streams

oos.close();

fos.close();

System.out.println("Object has been serialized");

// De-Serializing B's(subclass) object

// Reading the object from a file

FileInputStream fis = new FileInputStream("abc.ser");

ObjectInputStream ois = new ObjectInputStream(fis);

// Method for de-serialization of B's class object

B b2 = (B)ois.readObject();

// closing streams

ois.close();

fis.close();

System.out.println("Object has been deserialized");

System.out.println("i = " + b2.i);

System.out.println("j = " + b2.j);

}

}

输出:

i = 10

j = 20

Object has been serialized

A's class constructor called

Object has been deserialized

i = 0

j = 20

如果超类是可序列化的,但我们不希望子类被序列化:没有直接的方法来阻止java中的子类进行序列化。程序员可以通过在子类中实现writeObject()和readObject()方法来实现这一点,并且需要从这些方法中抛出NotSerializableException异常。这些方法分别在序列化和反序列化过程中执行。通过重写这些方法,我们只是实现了我们自己的定制序列化。

// Java program to demonstrate

// how to prevent

// subclass from serialization

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.NotSerializableException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

// superclass A

// implementing Serializable interface

class A implements Serializable

{

int i;

// parameterized constructor

public A(int i)

{

this.i = i;

}

}

// subclass B

// B class doesn't implement Serializable

// interface.

class B extends A

{

int j;

// parameterized constructor

public B(int i,int j)

{

super(i);

this.j = j;

}

// By implementing writeObject method,

// we can prevent

// subclass from serialization

private void writeObject(ObjectOutputStream out) throws IOException

{

throw new NotSerializableException();

}

// By implementing readObject method,

// we can prevent

// subclass from de-serialization

private void readObject(ObjectInputStream in) throws IOException

{

throw new NotSerializableException();

}

}

// Driver class

public class Test

{

public static void main(String[] args)

throws Exception

{

B b1 = new B(10, 20);

System.out.println("i = " + b1.i);

System.out.println("j = " + b1.j);

// Serializing B's(subclass) object

//Saving of object in a file

FileOutputStream fos = new FileOutputStream("abc.ser");

ObjectOutputStream oos = new ObjectOutputStream(fos);

// Method for serialization of B's class object

oos.writeObject(b1);

// closing streams

oos.close();

fos.close();

System.out.println("Object has been serialized");

// De-Serializing B's(subclass) object

// Reading the object from a file

FileInputStream fis = new FileInputStream("abc.ser");

ObjectInputStream ois = new ObjectInputStream(fis);

// Method for de-serialization of B's class object

B b2 = (B)ois.readObject();

// closing streams

ois.close();

fis.close();

System.out.println("Object has been deserialized");

System.out.println("i = " + b2.i);

System.out.println("j = " + b2.j);

}

}

输出:

i = 10

j = 20

Exception in thread "main" java.io.NotSerializableException

at B.writeObject(Test.java:44)

java 继承 序列化_Java中带继承的对象序列化 - Break易站相关推荐

  1. java url类_Java中的URL类和示例 - Break易站

    URL类是Internet上任何可用资源的网关.类URL表示统一资源定位符,它是指向万维网上"资源"的指针.资源可以指向简单的文件或目录,也可以引用更复杂的对象,例如对数据库或搜索 ...

  2. java 继承示例_Java中的继承类型以及示例

    java 继承示例 Prerequisite: Inheritance and its implementation in Java 先决条件: 继承及其在Java中的实现 Java中的继承类型 (T ...

  3. java图片序列化_Java中的强大武器——对象的序列化

    原标题:Java中的强大武器--对象的序列化 所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象.这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象, ...

  4. dictionary类 java_Java中的Dictionary 类与示例 - Break易站

    Java 集合框架 Java.util.Dictionary是一个抽象类,表示键值关系,并且与map类似.给定一个键,您可以存储值,并在需要时可以使用其键检索值.因此,它是键值对的列表. public ...

  5. java培训教程分享:Java中怎样将数据对象序列化和反序列化?

    本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...

  6. java继承序列化_java中序列化之子类继承父类序列化

    当一个父类实现Serializable接口后,他的子类都将自动的实现序列化. 以下验证了这一点: package Serial; import java.io.Serializable; public ...

  7. java 异常继承树_java中的error与exception

    Error类和Exception类都继承自Throwable类. Error的继承关系: Exception的继承关系: 二者的不同之处: Exception: 1.可以是可被控制(checked) ...

  8. java的继承_java中的继承(一)

    在java中,所有的类都有一个默认的父类Object,即使我们没有显式的去继承这个类.在Object类中定义了一些方法,其中有几个方法是我们必须掌握的,比如equals方法,hashCode方法,wa ...

  9. java中抽象类继承抽象类_Java中的抽象类用示例解释

    java中抽象类继承抽象类 Abstract classes are classes declared with abstract. They can be subclassed or extende ...

  10. java 封装 继承 堕胎_JAVA封装、继承、多态

    封装 1.概念: 将类的某些信息隐藏在类的内部,不允许外部程序访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: a.只能通过规定的方法访问数据 b.隐藏类的实例细节,方便修改和实 ...

最新文章

  1. Magic Leap 2实测出炉:视场角增大20度,重量减轻20%,透光率低至0.3%让AR特效更逼真...
  2. NTP时间服务相关基础及配置文件详解
  3. c语言删除文件remove_C程序删除文件
  4. sharding-jdbc整合mybatis
  5. C++从0到1的入门级教学(六)——函数
  6. matlab 写excel 慢_我在12w+的Python库中,发现了让Excel快到起飞的秘密......
  7. 文昌帝君 -- 《文昌帝君阴骘文》
  8. 组件:参数验证、组件:事件传递
  9. a deep leaning
  10. 抖音敏感词归类,抖音都有哪些违规词,违规行为。
  11. smith圆图重要性_数学之美:浅谈Smith圆图
  12. 谷歌学术搜索技巧,命令搜索
  13. EXCEL,神奇的lookup()函数
  14. 变量消元(Varible Elimination)和概率边缘化(Marginalization)的关系
  15. 西门子SMART200 PLC和托利多电子称自由口通讯程序
  16. 【概率】COGS1487 麻球繁衍
  17. 【CSS】如何设置文字在一排显示且有省略号
  18. 报名投票链接怎么做做一个投票的链接怎么做微信投票链接怎么做
  19. ps学习资料,很有用的!
  20. 课堂管理系统——Android

热门文章

  1. TF-IDF算法原理和公式
  2. 基于51单片机的银行排队叫号机设计
  3. python办公自动化——提取pdf中的文字和表格
  4. PHP搭建留言板,用PHP制作留言板_php
  5. echarts3 地图文字位置设置
  6. 摸索Detours 1:使用Vs2019 编译Detours
  7. log4j的详细配置(最省心完美配置)
  8. 主流视频编码器特点、优缺点归纳和比较(H.264、HEVC、VP9、AV1)
  9. 烽火通信2018校招软件工程师编程题 - 题解
  10. 同济大学计算机科学系下设几个专业,同济大学计算机科学与技术系简介