相关文章:
  1. 《IO流 (一) ----- 基本概念和File类》
  2. 《IO流 (二) ----- 文件流》
  3. 《IO流 (三) ----- 字符流和字符缓冲流》
  4. 《IO流 (四) ----- 转换流和标准字节输出流》
  5. 《IO流 (五) ----- 对象数据的序列化和反序列化》
本篇涉及内容

  • 对象的序列化和反序列化的概念

  • 序列化版本号的介绍

  • 用对象流实现对象的序列化和反序列化

一、关于对象的序列化和反序列化的概念

注意:

  1. 对象流是一个包装流,需要通过其他输入输出流来创建对象流。
  2. 参与序列化和反序列化的对象必须实现Serializable接口。
二、关于序列化版本号

  1. 通过代码发现,Serializable这个接口中什么代码都没有,但是它有什么作用呢?

    起到标识的作用,该接口是一个标志接口,当java虚拟机看到了类实现了该接口后,会为该类自动生成一个序列化版本号。

  2. 那么序列化版本号有什么用呢?

    1. 当一个类实现类Seializable接口后, 该类进行编译时,java虚拟机会为该类自动生成一个默认的序列化版本号,但是如果之后再对这个类的代码进行修改,序列化版本号就会变化,如果用修改后的新的类的引用去指向从以前保存的序列化对象数据的文件反序列化出来的对象则会产生异常:java.io.InvalidClassException,所以从某种意义上来说一个类的序列化版本号就可以用来区分类。
    2. java语言中用什么机制来区分类?
      (1) 首先通过类名进行对比,如果类名不一样,那么肯定不是同一个类。
      (2) 如果类名一样,则通过序列化版本号来区分。
  3. 默认生成序列化版本号的缺点

    1. 根据上面所述,如果修改了一个类中的代码,那么其序列化版本号会产生变化,对于我们修改之前序列化出来的对象数据文件来说就无法正常读取了。
    2. 改进:凡是一个类实现类Serializable接口,建议给该类提供一个固定不变的序列化版本号,这样即便是修改类中的代码,序列化版本号也不会改变,java虚拟机始终认为它是同一个类,之前的序列化对象文件数据也能够进行正常读取。
    3. 序列化版本号示例:
      private static final long serialVersionUID = 24253252352129776L;
  4. 使用IDEA自动生成序列化版本号
    (1) 先按照下图设置打勾

    (2) 之后在对应的类中鼠标指向类名,快捷键:option + 回车键,可以自动生成一个序列化版本号。

三、对象的序列化和反序列化

  1. 通过ObjectOutputStream实现对象的序列化

    
    User user1 = new User("莫莫",8);ObjectOutputStream oos = new ObjectOutputStream(new   FileOutputStream("user1"));oos.writeObject(user1);oos.flush();// flush后会生成一个user1文件oos.close();
  2. 通过ObjectInputStream实现对象的反序列化

    
    ObjectInputStream ois = new ObjectInputStream(new   FileInputStream("user1"));User user1 = (User) ois.readObject();System.out.println(user1);// User{name='莫莫', age=8}ois.close();
  3. 序列化和反序列化多个对象
    思路:将多个对象放在集合中,然后序列化、反序列化集合。

    
    List list = new ArrayList<>();
    list.add(new User("莫莫", 8));
    list.add(new User("考拉", 7));
    list.add(new User("芋头", 6));ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("users"));
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("users"));// 将集合序列化
    oos.writeObject(list);oos.flush();oos.close();// 将集合反序列化
    List<User> getList = (List<User>) ois.readObject();for (User user : getList) {System.out.println(user);
    }/**  User{name='莫莫', age=8}*  User{name='考拉', age=7}*  User{name='芋头', age=6}* */ois.close();
  4. transient关键字
    作用:"transient"翻译为“游离的”,当你不希望给对象中的某个属性(字段)进行序列化时,把该关键字加到其前面即可。

    我们把User类中的age属性添加上transient关键字。

    private String name;
    private transient int age;
    

    再重新运行上面的程序,则会出现:

    User{name='莫莫', age=0}
    User{name='考拉', age=0}
    User{name='芋头', age=0}
    

IO流 (五) ----- 对象数据的序列化与反序列化相关推荐

  1. Java IO流之对象流

    对象流 1.1对象流简介 1.2对象流分类 输入流字节流处理流:ObjectInputStream,将序列化以后的字节存储到本地文件 输出流字节流处理流:ObjectOutputStream 1.3序 ...

  2. 在内存流中对象的二进制序列化的问题

    翻看MSDN,关于对象序列化的示例最常见的都是在文件流中进行XML序列化,因为开发的需要,我必须要在内在流中将对象以二进制方式序列化,原以为很简单,copy一下示例改改就好了,原代码如下: publi ...

  3. oracle存储过程如何传递一个bean对象_对象传输,序列化和反序列化

    一.前言 二.基本概念 2.1 序列化和反序列化的定义及最重要的作用 序列化的定义:Java序列化就是指把Java对象转换为字节序列的过程: 反序列化的定义:Java反序列化就是指把字节序列恢复为Ja ...

  4. 序列化对象C++对象的JSON序列化与反序列化探索

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 一:背景 作为一名C++开发人员,我始终很期待能够像C#与JAVA那样,可以省力的进行对象的序列化与反序列化,但到现在为止,还没有找 ...

  5. Int类型数据的序列化以及反序列化(与Java服务器通讯预热)

    游戏前端,避免不了的跟服务器通讯,其实游戏的大部分逻辑都在服务端,并不在客户端,所以需要跟服务端通讯"协商"一些逻辑,既然通讯,就少不了的传输,传输之前又要序列化,这篇博客主要讲一 ...

  6. Json数据的序列化与反序列化的三种常用方法介绍

    以下内容是本作者从官网中看相应的教程后所做的demo,其体现了作者对相关知识点的个人理解..作者才疏学浅,难免会有理解不到位的地方..还请各位读者批判性对待...       本文主要介绍在Json数 ...

  7. Java基础(三)IO流和对象流

    文件及IO流 File类 1.来自于java.io包 2.是文件和目录路径名的抽象表示 3.文件和目录可以通过File封装为对象 4.对于File而言,封装的不是真正存在的文件,仅仅是封装一个路径,路 ...

  8. Java17-day08【File(创建和删除文件、判断和获取功能、遍历目录)、IO流(字节流写数据、异常处理、字节流读数据、复制文本文件、复制图片)】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

  9. 使用Java IO流实现网页数据爬取(一)

    使用Java实现网页数据爬取(IO流) 第一阶段:爬取网页源码及所有链接地址 引入代码步骤: 1.将ClimbImg.java,Demo.java文件导入 ClimbImg.java 爬取网页雏形 : ...

最新文章

  1. TokuDB · 引擎特性 · HybridDB for MySQL高压缩引擎TokuDB 揭秘
  2. memcached 的Linux安装
  3. VS2008工程转为VS2005(C++)
  4. DbVisualizer 数据库连接工具:添加数据库驱动方法。dbvis搜索不到驱动文件夹下的驱动解决方法
  5. html 静态资源缓存时间,.htaccess设置静态资源缓存(即浏览器缓存)
  6. 云南大学网络课程作业计算机,云南大学842计算机程序设计考研复习经验
  7. ARM assembly instruction set 汇总(一)
  8. 5G的7大用途,你知道几个?
  9. 聊天宝解散,多闪、马桶MT还会远吗?
  10. js两种生成对象模式(公有成员和成员私有)
  11. 后高考时代必备APP 社交、旅行都不能少
  12. GPUImage滤镜效果
  13. ENVI学习总结(六)——图像自动配准
  14. 日本电子业转型的东芝之困:多年亏损 后有强敌追兵
  15. 怎么提取pdf文件中的图片
  16. 电脑提醒没有权限在此位置保存文件怎么办?
  17. 2022年 AI 技术成熟度曲线
  18. 【IT互联网行业内,什么岗位工作更有前景?】
  19. OBS 基础 16 如何在CMake中添加新的lib库、头文件等
  20. memset函数原型

热门文章

  1. 浙大PAT CCCC L3-014 周游世界 ( 最短路变形 )
  2. vue中使用setTimeout
  3. vijos p1782——借教室(noip2012提高组第2题)
  4. 获取元素在文档上的正确坐标
  5. Symbian c++ 在3版中实现并动态配置开机自启动
  6. 期货市场技术分析05_交易量和持仓兴趣
  7. java 数组不重复_java如何找出数组中的不重复数字
  8. python安装包的方法与图解_Python包的几种安装方法,方式
  9. web报表工具FineReport的SQL编辑框的语法简介
  10. 大橡塑属于机器人板块吗_机器人中的启蒙教育