文档章节

父类的序列化与 Transient 关键字

Java搬砖工程师
 Java搬砖工程师
发布于 2019/02/14 15:16
字数 631
阅读 133
收藏 1

情境:一个子类实现了 Serializable 接口,

  • 它的父类都没有实现 Serializable 接口,
  • 序列化该子类对象,
  • 然后反序列化后输出父类定义的某变量的数值,该变量数值与序列化时的数值不同。

解决:

  • 要想将父类对象也序列化,就需要让父类也实现Serializable 接口。
  • 如果父类不实现的话的,就 需要有默认的无参的构造函数。
    • 在父类没有实现 Serializable 接口时,虚拟机是不会序列化父对象的,
    • 而一个 Java 对象的构造必须先有父对象,才有子对象,反序列化也不例外。
    • 所以反序列化时,为了构造父对象,只能调用父类的无参构造函数作为默认的父对象。
    • 因此当我们取父对象的变量值时,它的值是调用父类无参构造函数后的值。
      • 如果你考虑到这种序列化的情况,在父类无参构造函数中对变量进行初始化,
      • 否则的话,父类变量值都是默认声明的值,如 int 型的默认是 0,string 型的默认是 null。
  • 也就是说,要为一个没有实现Serializable接口的父类,编写一个能够序列化的子类要做两件事情: 

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

      其二、子类要负责序列化(反序列化)父类的域。 
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();//再反序列化父类的域 
  } 
}

 

Transient 关键字的作用是控制变量的序列化,

  • 在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,
  • 在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

© 著作权归作者所有

上一篇: java NIO原理
Java搬砖工程师
粉丝 37
博文 700
码字总数 353228
作品 0
南京
程序员
私信 提问
加载中

评论(0)

Java 序列化的高级认识

简介: 如果你只知道实现 Serializable 接口的对象,可以序列化为本地文件。那你最好再阅读该篇文章,文章对序列化进行了更深一步的讨论,用实际的例子代码讲述了序列化的高级认识,包括父类...

红薯
2011/03/20
5.3K
24
java序列化-Serializable

代码: 序列化后的文件: 读取文件反序列化: name=promonkey age=22 静态变量不会序列化,也就是说吧name或age变成static,反序列化后输出的值还是当前类的静态变量值。 transient关键字修饰...

liujiest
2016/07/23
40
0
Java中对象序列化与反序列化

概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文...

Hosee
2015/12/14
1.4K
0
Android 序列化 & 反序列化

What? 何为序列化与反序列化? *序列化:*将对象转化为二进制序列的过程 *反序列化:*将二进制序列恢复为原始对象的过程 Why? 为什么需要序列化?由于在系统底层,数据以简单的字节序列形式...

紫韵
2016/06/29
80
0
Java序列化之Serializable

1.需求 1.什么是Java序列化 2.详解 1.序列化 理解为"打碎"即可 2.在书本上序列化的意思是将Java对象转为二进制 3.java平台允许我们在内存中创建对象,当JVM运行时对象才能存在,如果JVM停止,对...

村长大神
2018/05/08
65
0

没有更多内容

加载失败,请刷新页面

加载更多

入门级科普:五分钟让你的应用拥有高精度定位功能

本文作者:用户_123456789 什么是智能定位服务 定位能力即帮助用户解决“我在哪”的问题,依托百度位置大数据及多种混合定位方式,百度地图开放平台为智能穿戴、用车出行、快递物流、生活服务...

百度开发者中心
2019/08/14
9
0
在Ruby on Rails中对nil v。空v。空白的简要解释 - A concise explanation of nil v. empty v. blank in Ruby on Rails

问题: I find myself repeatedly looking for a clear definition of the differences of nil? 我发现自己一再寻找nil?差异的明确定义nil? , blank? , blank? , and empty? , empty? in ......

javail
今天
15
0
DevOps与NoOps现状分析

时下的IT趋势中,DevOps 正是一个热语。它起源于几年前SPA (单页面应用) 的前端应用.我认为常态的IT技术适应就是,在新技术爆发的那一时刻开始,立马就会被敏锐的人们所采用,然后被快速传播...

tidings_
今天
21
0
OSChina 周六乱弹 —— 代码创造人工生命

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @小小编辑推荐:《inner universe》 - ORIGA 《inner universe》 - ORIGA 手机党少年们想听歌,请使劲儿戳(这里) 当机器人具有意识的时候,...

小小编辑
今天
20
1
怎么创建远程桌面连接

1、IIS7远程桌面 管理中文最新版是一款专业的远程桌面管理工具,更新了原09网络远程桌面管理,较之以前的版本,操作更加便捷,能够同时远程多台服务器,多台服务器间自由切换,完全无压力。I...

吹的心痒痒
今天
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部