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

当一个父类实现Serializable接口后,他的子类都将自动的实现序列化。

以下验证了这一点:

package Serial;

import java.io.Serializable;

public class SuperC implements Serializable {//父类实现了序列化

int supervalue;

public SuperC(int supervalue) {

this.supervalue = supervalue;

}

public String toString() {

return "supervalue: "+supervalue;

}

}

public class SubC extends SuperC {//子类

int subvalue;

public SubC(int supervalue,int subvalue) {

super(supervalue);

this.subvalue=subvalue;

}

public String toString() {

return super.toString()+" sub: "+subvalue;

}

}

public class Test1 {

public static void main(String [] args){

SubC subc=new SubC(100,200);

FileInputStream in=null;

FileOutputStream out=null;

ObjectInputStream oin=null;

ObjectOutputStream oout=null;

try {

out = new FileOutputStream("Test1.txt");//子类序列化

oout = new ObjectOutputStream(out);

oout.writeObject(subc);

oout.close();

oout=null;

in = new FileInputStream("Test1.txt");

oin = new ObjectInputStream(in);

SubC subc2=(SubC)oin.readObject();//子类反序列化

System.out.println(subc2);

} catch (Exception ex){

ex.printStackTrace();

} finally{

…此处省略

}

}

}

运行结果如下:

supervalue: 100 sub: 200

可见子类成功的序列化/反序列化了。

怎管让子类实现序列化看起来是一件很简单的事情,但有的时候,往往我们不能够让父类实现Serializable接口,原因是有时候父类是抽象的(这并没有关系),并且父类不能够强制每个子类都拥有序列化的能力。换句话说父类设计的目的仅仅是为了被继承。

要为一个没有实现Serializable接口的父类,编写一个能够序列化的子类是一件很麻烦的事情。java docs中提到:

“To allow subtypes of non-serializable classes to be serialized, the subtype may assume responsibility for saving and restoring the state of the supertype's public, protected, and (if accessible) package fields. The subtype may assume this responsibility only if the class it extends has an accessible no-arg constructor to initialize the class's state. It is an error to declare a class Serializable if this is not the case. The error will be detected at runtime. ”

也就是说,要为一个没有实现Serializable接口的父类,编写一个能够序列化的子类要做两件事情:

其一、父类要有一个无参的constructor;

其二、子类要负责序列化(反序列化)父类的域。

我们将SuperC的Serializable接口去掉,而给SubC加上Serializable接口。运行后产生错误:

java.lang.Error: Unresolved compilation problem:

Serializable cannot be resolved or is not a valid superinterface

at Serial.SubC.(SubC.java:15)

at Serial.Test1.main(Test1.java:19)

Exception in thread "main"

果真如docs中所说的一样,父类缺少无参构造函数是不行的。

接下来,按照docs中的建议我们改写这个例子:

public abstract class SuperC {

int supervalue;

public SuperC(int supervalue) {

this.supervalue = supervalue;

}

public SuperC(){}//增加一个无参的constructor

public String toString() {

return "supervalue: "+supervalue;

}

}

public class SubC extends SuperC implements Serializable {

int subvalue;

public SubC(int supervalue,int subvalue) {

super(supervalue);

this.subvalue=subvalue;

}

public String toString() {

return super.toString()+" sub: "+subvalue;

}

private void writeObject(java.io.ObjectOutputStream out)

throws IOException{

out.defaultWriteObject();//先序列化对象

out.writeInt(supervalue);//再序列化父类的域

}

private void readObject(java.io.ObjectInputStream in)

throws IOException, ClassNotFoundException{

in.defaultReadObject();//先反序列化对象

supervalue=in.readInt();//再反序列化父类的域

}

}

运行结果证明了这种方法是正确的。在此处我们用到了writeObject/ readObject方法,这对方法如果存在的话,序列化时就会被调用,以代替默认的行为(以后还要探讨,先了解这么多)。我们在序列化时,首先调用了ObjectOutputStream的defaultWriteObject,它使用默认的序列化行为,然后序列化父类的域;反序列化的时候也一样。

归纳一下:

目的 行为

为一个实现Serializable接口的父类,编写一个能够序列化的子类 子类将自动的实现序列化

为一个没有实现Serializable接口的父类,编写一个能够序列化的子类 1, 父类要有一个无参的constructor;2, 子类要先序列化自身,然后子类要负责序列化父类的域

跟多参考:http://www.ibm.com/developerworks/cn/java/j-lo-serial/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1324. 竖直打印单词

1. 题目 给你一个字符串 s。请你按照单词在 s 中的出现顺序将它们全部竖直返回。 单词应该以字符串列表的形式返回,必要时用空格补位,但输出尾部的空格需要删除(不允许尾随空格)。 每个单词只能放在一列上,每一列中也…

SubSonic中的字段付值--MakeOld Update

根据设计当MakeOld后(在读取数据库后,或者手动调用),对记录(SubSonic生成的类)属性附值时,Sonic会检测这个Value是否与原来的不同,只有值不同时才会附值成功,并将该列添加到DirtyCol…

java从控制台输入数组_Java将控制台输入的一行整数转成整型数组

思路:将一行数据按字符串的形式读取进来。首先判断输入的字符串是不是空,为空的话,则不作任何操做。其次,将字符串按照指定方式切分为字符串数组,此处是按照空格切分,由于输入是按空格区分的。最后&#xf…

java私有表示标识_java里面的标识符、关键字和类型

1. 注释Java中有三种注释:(1) // -单行注释,注释从“//”开始,终止于行尾;(2) -多行注释,注释从““结束;(3) -是Java特有的doc注释,这种注释主要是为支持JDK工具Javadoc而采用的。Javadoc能识…

在Silverlight中使用Socket进行通信(1)Socket请求-回复方式的简易数据交换

很久之前用过Socket,由于近期项目需要用socket传输视频流,早上花了半小时回顾了一下。 Socket类简要介绍 socket下提供的主要类有四个,分别是socket,tcpclient,tcplistener,udpclient,他们的作用如下: Socket 含有大量…

LeetCode 692. 前K个高频单词(优先队列)

1. 题目 给一非空的单词列表,返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。 如果不同的单词有相同出现频率,按字母顺序排序。 示例 1: 输入: ["i", "love", "leetcode", &q…

LeetCode 583. 两个字符串的删除操作(动态规划)

1. 题目 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。 示例: 输入: "sea", "eat" 输出: 2 解释: 第一步将"sea"变为"ea"&…

java listview控件_ListView普通列表控件的使用

Android中的列表空间非常灵活,可以自定义每一个列表项,实际上每一个列表项就是一个View,在Android定义了3个列表控件:ListView、ExpandableListView和Spinner,其中Spinner就是在Windows中常见的下拉列表框。ListView控…

【Kaggle】Intro to Machine Learning 第一次提交 Titanic

项目官网地址 新手可以参考这篇 8、Getting Started With Titanic,教你如何操作、提交等 自己简要再记录一下: Join the competition 各个 tab 下可以查看数据Data、代码编写Notebooks、讨论、排名、比赛规则、队伍点击 Notebooks,新建文…

在C#代码中执行BCS外部内容类型方法

在前面的博文中我们讨论了如何使用Business Connectivity Services对象模型栏获取已部署在SharePoint BCS中的外部内容类型。 本文中我们将学习如何获取一个ECT的BCS方法集合。并且还要通过Business Connectivity Services对象模型执行其中的Finder方法和SpecificFinder方法。…

java ndc_通过slf4j/log4j的MDC/NDC 实现日志追踪

在分布式系统或者较为复杂的系统中,我们希望可以看到一个客户请求的处理过程所涉及到的所有子系统\模块的处理日志。由于slf4j/log4j基本是日志记录的标准组件,所以slf4j/log4j成为了我的重点研究对象。slf4j/log4j支持MDC,可以实现同一请求的…

常用的匹配正则表达式

常用的匹配正则表达式 正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。 匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式…

LeetCode 1091. 二进制矩阵中的最短路径(BFS)

1. 题目 在一个 N N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1)。 一条从左上角到右下角、长度为 k 的畅通路径, 由满足下述条件的单元格 C_1, C_2, ..., C_k 组成:相邻…

java 反射的弊端_java反射机制的一些学习心得小结

概述之前在了解Spring的类加载机制的时候,了解了java的反射机制。但是,我对反射理解一直不深。也一直有点疑惑:Spring为什么利用反射创建对象?直接new对象和依靠反射创建对象有什么区别?什么是动态加载类?什…

llog

/Files/TNTZWC/zxLog.rar转载于:https://www.cnblogs.com/TNTZWC/archive/2010/07/13/1776437.html

LeetCode 1015. 可被 K 整除的最小整数(数学)

1. 题目 给定正整数 K,你需要找出可以被 K 整除的、仅包含数字 1 的最小正整数 N。 返回 N 的长度。如果不存在这样的 N,就返回 -1。 示例 1: 输入:1 输出:1 解释:最小的答案是 N 1,其长度为…

网站公告js

<html><head><meta http-equiv"Content-Language" content"zh-cn"><meta http-equiv"Content-Type" content"text/html; charsetgb2312"><title>网站公告滚动</title></head><body> …

LeetCode 923. 三数之和的多种可能(双指针)

1. 题目 给定一个整数数组 A&#xff0c;以及一个整数 target 作为目标值&#xff0c;返回满足 i < j < k 且 A[i] A[j] A[k] target 的元组 i, j, k 的数量。 由于结果会非常大&#xff0c;请返回 结果除以 10^9 7 的余数。 示例 1&#xff1a; 输入&#xff1a;…

Java用sqlit拆分小数_如何将SQLite列中的分隔值拆分为多列

拉开一列是为Python非常简单(不确定关于SQLite)。这将您的DB行简化为一个字符串数组&#xff0c;并且应该与SQLite返回类似。text [Apple,Banana, Pear,Lemon, Peach, Apricot]for line in text:cols [c.strip() for c in line.split(,)]print(cols)应该输出每串线阵列&#…

Flex读取XML不刷新问题

Flex读取servlet提供的xml数据&#xff0c;有更新功能。数据更新后&#xff0c;Firefox下完全正常&#xff0c;IE下死活刷新不出新数据。郁闷呢了好长时间&#xff0c;以为是资源释放的问题。整整高了将近两个小时。没搞定&#xff0c;只能请教头了。问题描述完&#xff0c;头问…