点击上方蓝字设为星标

每天傍晚伴你一起成长!

Java 中的序列化序列是一个重要的编程概念。它适用于所有主要的编程语言。在本章中,我们将尝试在Java语言的上下文中理解此概念。在本章的最后,我们将能够

•从概念上了解序列化和反序列化的含义•了解Java代码进行序列化和反序列化

让我们首先以通用形式定义两个术语,而与任何编程语言无关。

什么是序列化?

序列化是将类的实例(类的对象)转换为字节流的过程。然后,该字节流可以作为文件存储在磁盘上,也可以通过网络发送到另一台计算机。程序关闭或休眠时,序列化还可用于保存Object的状态。使用序列化将状态保存在磁盘上后,我们可以通过从磁盘反序列化类来恢复状态。

让我们尝试使用一个小图将其可视化。在此图中,我们将创建一个名为Rectangle的小类,它表示一个真实的矩形。这是该类的代码

public class Rectangle {

 private double height; private double width;

 public Rectangle(double height, double width){ this.height = height; this.width = width; }

 public double Area(){ return height * width; }

 public double Perimeter(){ return 2 * (height + width); }}

注意: 根据Java标准,此类尚未可序列化,让我们暂时将其忽略。

Rectangle类的序列化过程如下所示。

从矩形类的对象转换为字节流的编码方案受这里[1]提到的序列化编码标准的约束。

可序列化的接口

在Java中,Serializable对象是从两个接口中的任何一个继承的对象

java.io.Serializable[2]java.io.Externalizable[3]

可序列化的接口是标记接口。这意味着,如果您的类是从该接口派生的,则不必实现任何方法。这只是一个标记,当尝试序列化该类时,Java运行时将只检查该接口在类中是否存在。如果在类继承层次结构中存在Serializable接口,则Java运行时将负责该类的Serialization。

另一方面,Externalizable接口不是标记接口。如果从Externalizable接口派生,则必须实现这两种方法

readExternal(ObjectInput输入)writeExternal(ObjectOutput输出)

仅当我们想超越Java的默认序列化机制时,才应该从Externalizable接口继承。如果要使用默认Java的序列化机制,则只能从Serializable接口继承。

有了这种理解,我们的Rectangle类现在将从Serializable接口继承。

public class Rectangle implements Serializable{

 private double height; private double width;

 public Rectangle(double height, double width){ this.height = height; this.width = width; }

 public double Area(){ return height * width; }

 public double Perimeter(){ return 2 * (height + width); }}

用Java序列化对象

让我们快速看一下Java中的序列化过程。在此过程中,我们将执行以下四个步骤

1.我们将在要序列化该类的位置创建一个文件的新FileOutputStream

2.然后,我们将在步骤1中创建的FileOutputStream上使用ObjectOutputStream

3.然后,我们将对象写入ObjectOutputStream4.最后,我们将关闭所有流对象以保存正确的写入并终止所有流。

下面是执行任务的代码。请注意上面每一行代码中提到的注释。

public static void SerializeToFile(Object classObject, String fileName){ try {

 // Step 1: Open a file output stream to create a file object on disk. // This file object will be used to write the serialized bytes of an object FileOutputStream fileStream = new FileOutputStream(fileName);

 // Step 2: Create a ObjectOutputStream, this class takes a files stream. // This class is responsible for converting the Object of any type into // a byte stream ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);

 // Step 3: ObjectOutputStream.writeObject method takes an Object and  // converts it into a ByteStream. Then it writes the Byte stream into // the file using the File stream that we created in step 1. objectStream.writeObject(classObject);

 // Step 4: Gracefully close the streams objectStream.close(); fileStream.close();

 } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }}

public static void main(String[] args){ Rectangle rect = new Rectangle(18, 78); SerializeToFile(rect, "rectSerialized");

}

当我们运行该程序时,它将在项目的根文件夹中创建一个名为“ rectSerialized” 的文件。只需浏览到该位置,然后尝试使用记事本打开文件即可。下图显示

当您打开此文件时,您可以看到它包含乱码。内容已编码,并且不是人类可读的格式。如下图所示。

这显示了序列化的确切含义以及我们如何序列化Java中的对象。这还应该使您对序列化过程中涉及的不同步骤有实际的了解,包括不同步骤的输入和输出结果。

反序列化为Java中的对象

在上一节中,我们了解了序列化将类实例转换为字节流,然后将其存储在磁盘上的文件中。让我们快速看一下Java中的反序列化过程,它与序列化相反。在此过程中,我们将从文件中读取序列化的字节流,并将其转换回Class实例表示形式。这是我们将要遵循的步骤。

1.我们将创建一个新的FileInputStream来读取包含目标类的序列化字节流的文件。在我们的例子中是矩形类。
2.然后,我们将在步骤1中创建的FileInputStream上创建一个 ObjectInputStream。
3.然后,我们将使用ObjectInputStream读取对象 并将其存储在Rectangle类型的变量中。
4.最后,我们将关闭所有流对象以保存正确的写入并终止所有流。

下面是执行任务的代码。请注意上面每一行代码中提到的注释。

public static Object DeSerializeFromFileToObject(String fileName){ try {

 // Step 1: Create a file input stream to read the serialized content // of rectangle class from the file FileInputStream fileStream = new FileInputStream(new File(fileName));

 // Step 2: Create an object stream from the file stream. So that the content // of the file is converted to the Rectangle Object instance ObjectInputStream objectStream = new ObjectInputStream(fileStream);

 // Step 3: Read the content of the stream and convert it into object Object deserializeObject = objectStream.readObject();

 // Step 4: Close all the resources objectStream.close(); fileStream.close();

 // return the deserialized object return deserializeObject;

 } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null;}

public static void main(String[] args){ Rectangle rect = new Rectangle(18, 78); SerializeToFile(rect, "rectSerialized");

 Rectangle deSerializedRect = (Rectangle) DeSerializeFromFileToObject("rectSerialized"); System.out.println("Rect area is " + deSerializedRect.Area());}

只是为了验证Rectangle类的原始状态是否已还原,我们将调试代码并检查 deSerializedRect 变量。下图显示了(高度:18和宽度:78)矩形类的原始状态已还原。

我希望本教程能够为您梳理清楚Java序列化和反序列化的基本概念。


END

时光,在物转星移中渐行渐远,春花一梦,流水无痕,没有在最想做的时候去做的事情,都是人生的遗憾。人生需要深思熟虑,也需要一时的冲动。

fileinputstream自定义类序列化和反序列化_Rest Assured篇:Java中的序列化和反序列化...相关推荐

  1. JAVA中JSON序列化和反序列化

    JAVA中JSON序列化和反序列化 1 FASTJSON的序列化和反序列化 1.1 主函数 1.2 自定义对象 2 GSON序列化和反序列化 2.1 主函数 2.2 自定义对象 总结 不同包序列化和反 ...

  2. java中实现序列化的作用

    Java 中进行序列化操作需要实现 Serializable 或 Externalizable 接口.序列化的目的有两个,第一个是便于存储,第二个是便于传输.一.序列化作用:1. 提供一种简单又可扩展 ...

  3. java中的序列化和反序列化

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

  4. K:java中的序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?以下内容将围绕这些问题进行展开讨论. Java序列化与反序列化 简单来说Java序列化是指把Java对象转 ...

  5. java自定义类怎么比大小_实战:Java 扑克牌比较游戏

    一.目的 通过实现一个简单的扑克牌比大小的游戏,体会面向对象编程的思想. 二.技术 1.常量类 2.类的创建,封装 3.单例模式 4.自定义异常类 三.如何使用 1.常量类 对于程序运行过程中,一直不 ...

  6. 对象序列化Java中的序列化

    首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 当两个进程在停止远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都市以二进制序列的情势在络网上传送.发送方需要把这个Java对 ...

  7. Java中的序列化问题

    Java序列化是指将Java中的类对象状态以字节的形式保存,需要的时候可以解码获取,通常用于共享数据交互.网络通信等.在Java中,属于对象的状态才应该保存,因此,静态数据成员不能保存:如果不愿意保存 ...

  8. Java中的序列化到底是什么

    我们都知道,新建一个对象的时候实现 Serializeable 接口,但为什么要这么做?什么时候这样子做?这样子做会不会出现幺蛾子?阿淼一个三连差点把自己都问懵逼了-- 那接下来,大家就和阿淼一起简单 ...

  9. java 只有日期的类_【你不知道的事系列】Java中处理日期的类

    Java中提供了一系列用于处理日期.时间的类,包括创建日期,时间对象,获取系统当前日期,时间等操作 Date类: 位于java.util.Date,从JDK1.0起就存在了,但现在它的大部分构造器,方 ...

最新文章

  1. Node webkit启动最大化窗口
  2. 点云数据的类型主要分为_点云学习在自动驾驶中的研究概述
  3. 我是如何用Worktile进行敏捷开发的
  4. Redis 实战笔记
  5. 一致性 Hash 算法学习(分布式或均衡算法)
  6. MySQL Hardware--FIO压测
  7. 热敏电阻如何查表计算温度_额温枪温补算法:热电堆温度补偿算法 MTP10B7F55
  8. MySQL主从复制的原理及配置方法(比较详细)
  9. 机器学习-多项式回归、正规方程(标准方程)
  10. Linux下查看端口状态的小工具lsof
  11. STM32F429+W25Q256+TouchFGX
  12. 初识python之汇率转换篇
  13. 什么是软件项目管理?
  14. 绝对优势与比较优势的数学分析与其…
  15. 李梦恬爸爸分享之第十周课程资源
  16. 2023年全国最新交安安全员精选真题及答案4
  17. 用python绘制y=x,y=1+sinx,编写Python程序,使用numpy、pandas、matplotlib三个扩展库在一个画布中绘制4个子图.
  18. 无线个人通信(WPAN)-蓝牙
  19. Struts原理与实践
  20. CNI(Container Network Plugin)

热门文章

  1. linux消息信号丢失,Linux信号丢失问题分析
  2. xfs_repair 实际工作中的问题
  3. Java 18 正式发布
  4. 如何用 Markdown 来画图?
  5. Linux 实时查看日志文件的 4 种方法
  6. 皮一皮:这是什么鬼畜产品!
  7. 垂垂老矣,一代人的回忆,Adobe Flash 寿命将尽
  8. 死磕Java并发:J.U.C之Condition
  9. pytorch默认初始化_小白学PyTorch | 9 tensor数据结构与存储结构
  10. java数据通道抽象为流_【java】IO流