ObjectInputStream 类

  1、概述

      java.io.ObjectInputStream extends InputStream

    ObjectInputStream 反序列化流,将之前使用 ObjectOutputStream 序列化的原始数据恢复为对象,以流的方式读取对象。

  2、构造方法

ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream。

    参数:InputStream in:字节输入流

  3、特有的成员方法

Object readObject() 从 ObjectInputStream 读取对象。

  

  4、使用步骤

    ① 创建ObjectInputStream对象,构造方法中传递字节输入流

    ② 使用ObjectInputStream对象中的方法readObject读取保存对象的文件

    ③ 释放资源

    ④ 使用读取出来的对象(打印)

  5、注意

     readObject方法声明抛出了ClassNotFoundException(class文件找不到异常)

    当不存在对象的 class 文件时抛出此异常:

    反序列化的前提:

      ① 类必须实现 Seriaizable

      ② 必须存在类对应的 class 文件

  6、反序列化操作1

    如果能找到一个对象的class文件,可以进行反序列化操作,调用 ObjectInputStream 读取对象的方法:

public final Object readObject () : 读取一个对象。

      Demo:

 public static void main(String [] args) {
Employee e = null;
try {
// 创建反序列化流
FileInputStream fileIn = new FileInputStream("employee.txt");
ObjectInputStream in = new ObjectInputStream(fileIn);
// 读取一个对象
e = (Employee) in.readObject();
// 释放资源
in.close();
fileIn.close();
}catch(IOException i) {
// 捕获其他异常
i.printStackTrace();
return;
}catch(ClassNotFoundException c) {
// 捕获类找不到异常
System.out.println("Employee class not found");
c.printStackTrace();
return;
}
// 无异常,直接打印输出
System.out.println(e); }
}

  对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个ClassNotFoundException 异常。

  7、反序列化操作2

    当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个 InvalidClassException 异常。

    原因如下:

      ① 该类的序列版本号与从流中读取的类描述符的版本号不匹配

      ② 该类包含未知数据类型

      ③ 该类没有可访问的无参数构造方法

      Serializable 接口给需要序列化的类,提供了一个序列版本号。 serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。

    解决方法:

      ① 修改本地的serialVersionUID为流中的serialVersionUID

      ② 在当初实现Serializable接口时,就固定一个serialVersionUID,这样每次编译就不会自动生成一个新的serialVersionUID

    Demo:

 public class Employee implements java.io.Serializable {
// 加入序列版本号
private static final long serialVersionUID = 1L;
public String name;
public String address;
// 添加新的属性 ,重新编译, 可以反序列化,该属性赋为默认值.
public int eid;
public void addressCheck() {
System.out.println("Address check : " + name + " ‐‐ " + address);
}
}

  序列号冲突异常的原理和解决方案:

Java 之 ObjectInputStream 类的更多相关文章

  1. java.io.ObjectInputStream类详解

    1.public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants分析 ...

  2. 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)

    目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...

  3. ObjectInputStream类和ObjectInputStream类的使用

    版权声明:本文为博主原创文章,未经博主允许不得转载. ObjectInputStream和ObjectInputStream类创建的对象被称为对象输入流和对象输出流. 创建文件输出流代码: FileO ...

  4. eclipse 编译出错(java.io.ObjectInputStream)的解决办法

    Multiple markers at this line - The type java.io.ObjectInputStream cannot be resolved. It is indirec ...

  5. java使用ObjectInputStream从文件中读取对象

    import java.io.EOFException;import java.io.FileInputStream;import java.io.FileNotFoundException;impo ...

  6. Java 最常用类(前1000名) 来自GitHub 3000个项目

    这篇文章主要介绍了最常用的1000个Java类(附代码示例),需要的朋友可以参考下 分析Github 3000个开源项目,粗略统计如下.括号内的数字是使用频率 0-3000. 下面的列表显示不全,完整 ...

  7. 转:ObjectInputStream类和ObjectInputStream类的使用

    ObjectInputStream和ObjectInputStream类创建的对象被称为对象输入流和对象输出流. 创建文件输出流代码: FileOutputStream file_out = new ...

  8. Java 序列化工具类

    import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sun.misc.BASE64Decoder; import sun.m ...

  9. 对象流,它们是一对高级流,负责即将java对象与字节之间在读写的过程中进行转换。 * java.io.ObjectOutputStream * java.io.ObjectInputStream

    package seday06; import java.io.Serializable;import java.util.Arrays; /** * @author xingsir * 使用当前类来 ...

随机推荐

  1. openresty开发系列25--openresty中使用json模块

    openresty开发系列25--openresty中使用json模块 web开发过程中,经常用的数据结构为json,openresty中封装了json模块,我们看如何使用 一)如何引入cjson模块 ...

  2. 基于keras的triplet_loss

    https://blog.csdn.net/yjy728/article/details/79570554 https://blog.csdn.net/yjy728/article/details/7 ...

  3. 【插件】thinkphp5+百度编辑器自定义上传

    1 官方下载sdk 2 在引入编辑器页面.写入js // 百度编辑器 UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActi ...

  4. Qt编写气体安全管理系统13-短信告警

    一.前言 短信告警这个模块在很多项目中都用上了,比如之前做过的安防系统,温湿度报警系统等,主要的流程就是收到数据判断属于某种报警后,组织短信字符串内容,发送到指定的多个手机号码上面,使用的是短信猫硬件 ...

  5. ios开发注意事项小总结

    一.LaunchScreen LaunchScreen产生原因:代替之前的启动图片 好处: 1.可以展示更多的东西 2.可以只需要出一个尺寸的图片. 启动图片的优先级 启动图片 < Launch ...

  6. LODOP带空格和不带空格的字体对齐

    有时候需要用到字体上下对齐,有些需要的文字较多,较少的文字需要加部分空格才能向上面的文字对齐.本文实际测试了一下字体对齐需要的空格.代码是在editplus里写的,该编辑软件里的字体首选项设置的是Co ...

  7. 【Leetcode_easy】1037. Valid Boomerang

    problem 1037. Valid Boomerang 参考 1. Leetcode_easy_1037. Valid Boomerang; 完

  8. 【warning】set the environment variable MXNET_CUDNN_AUTOTUNE_DEFAULT to 0 to disable

    前言 运行mxnet程序的时候出现这个warning信息,但是不影响整个程序的运行,不过宝宝喜欢将warning信息尽量也clear,强迫症嘛?!哈哈哈哈 问题描述 [::] src/operator ...

  9. nodejs实现一个文件存储服务

    nodejs实现一个文件存储服务 模拟文件上传下载功能: PUT 上传一个文件,URL表示在服务器上待上传文件的路径. GET 下载一个文件,URL表示在服务器上待下载文件的路径.

  10. Nginx虚拟目录(alias)和根目录(root)

    功能要求: 假设nginx配置的域名是www.kazihuo.com,现有静态资源/home/www/oye目录需要通过nginx访问. 功能实现: 前提要求: 1.在nginx.conf中到处第二行 ...