java 继承 序列化_Java中带继承的对象序列化 - Break易站
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易站相关推荐
- java url类_Java中的URL类和示例 - Break易站
URL类是Internet上任何可用资源的网关.类URL表示统一资源定位符,它是指向万维网上"资源"的指针.资源可以指向简单的文件或目录,也可以引用更复杂的对象,例如对数据库或搜索 ...
- java 继承示例_Java中的继承类型以及示例
java 继承示例 Prerequisite: Inheritance and its implementation in Java 先决条件: 继承及其在Java中的实现 Java中的继承类型 (T ...
- java图片序列化_Java中的强大武器——对象的序列化
原标题:Java中的强大武器--对象的序列化 所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象.这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象, ...
- dictionary类 java_Java中的Dictionary 类与示例 - Break易站
Java 集合框架 Java.util.Dictionary是一个抽象类,表示键值关系,并且与map类似.给定一个键,您可以存储值,并在需要时可以使用其键检索值.因此,它是键值对的列表. public ...
- java培训教程分享:Java中怎样将数据对象序列化和反序列化?
本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...
- java继承序列化_java中序列化之子类继承父类序列化
当一个父类实现Serializable接口后,他的子类都将自动的实现序列化. 以下验证了这一点: package Serial; import java.io.Serializable; public ...
- java 异常继承树_java中的error与exception
Error类和Exception类都继承自Throwable类. Error的继承关系: Exception的继承关系: 二者的不同之处: Exception: 1.可以是可被控制(checked) ...
- java的继承_java中的继承(一)
在java中,所有的类都有一个默认的父类Object,即使我们没有显式的去继承这个类.在Object类中定义了一些方法,其中有几个方法是我们必须掌握的,比如equals方法,hashCode方法,wa ...
- java中抽象类继承抽象类_Java中的抽象类用示例解释
java中抽象类继承抽象类 Abstract classes are classes declared with abstract. They can be subclassed or extende ...
- java 封装 继承 堕胎_JAVA封装、继承、多态
封装 1.概念: 将类的某些信息隐藏在类的内部,不允许外部程序访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: a.只能通过规定的方法访问数据 b.隐藏类的实例细节,方便修改和实 ...
最新文章
- Magic Leap 2实测出炉:视场角增大20度,重量减轻20%,透光率低至0.3%让AR特效更逼真...
- NTP时间服务相关基础及配置文件详解
- c语言删除文件remove_C程序删除文件
- sharding-jdbc整合mybatis
- C++从0到1的入门级教学(六)——函数
- matlab 写excel 慢_我在12w+的Python库中,发现了让Excel快到起飞的秘密......
- 文昌帝君 -- 《文昌帝君阴骘文》
- 组件:参数验证、组件:事件传递
- a deep leaning
- 抖音敏感词归类,抖音都有哪些违规词,违规行为。
- smith圆图重要性_数学之美:浅谈Smith圆图
- 谷歌学术搜索技巧,命令搜索
- EXCEL,神奇的lookup()函数
- 变量消元(Varible Elimination)和概率边缘化(Marginalization)的关系
- 西门子SMART200 PLC和托利多电子称自由口通讯程序
- 【概率】COGS1487 麻球繁衍
- 【CSS】如何设置文字在一排显示且有省略号
- 报名投票链接怎么做做一个投票的链接怎么做微信投票链接怎么做
- ps学习资料,很有用的!
- 课堂管理系统——Android