fileinputstream自定义类序列化和反序列化_Rest Assured篇:Java中的序列化和反序列化...
每天傍晚伴你一起成长!
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中的序列化和反序列化...相关推荐
- JAVA中JSON序列化和反序列化
JAVA中JSON序列化和反序列化 1 FASTJSON的序列化和反序列化 1.1 主函数 1.2 自定义对象 2 GSON序列化和反序列化 2.1 主函数 2.2 自定义对象 总结 不同包序列化和反 ...
- java中实现序列化的作用
Java 中进行序列化操作需要实现 Serializable 或 Externalizable 接口.序列化的目的有两个,第一个是便于存储,第二个是便于传输.一.序列化作用:1. 提供一种简单又可扩展 ...
- java中的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
- K:java中的序列化与反序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?以下内容将围绕这些问题进行展开讨论. Java序列化与反序列化 简单来说Java序列化是指把Java对象转 ...
- java自定义类怎么比大小_实战:Java 扑克牌比较游戏
一.目的 通过实现一个简单的扑克牌比大小的游戏,体会面向对象编程的思想. 二.技术 1.常量类 2.类的创建,封装 3.单例模式 4.自定义异常类 三.如何使用 1.常量类 对于程序运行过程中,一直不 ...
- 对象序列化Java中的序列化
首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 当两个进程在停止远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都市以二进制序列的情势在络网上传送.发送方需要把这个Java对 ...
- Java中的序列化问题
Java序列化是指将Java中的类对象状态以字节的形式保存,需要的时候可以解码获取,通常用于共享数据交互.网络通信等.在Java中,属于对象的状态才应该保存,因此,静态数据成员不能保存:如果不愿意保存 ...
- Java中的序列化到底是什么
我们都知道,新建一个对象的时候实现 Serializeable 接口,但为什么要这么做?什么时候这样子做?这样子做会不会出现幺蛾子?阿淼一个三连差点把自己都问懵逼了-- 那接下来,大家就和阿淼一起简单 ...
- java 只有日期的类_【你不知道的事系列】Java中处理日期的类
Java中提供了一系列用于处理日期.时间的类,包括创建日期,时间对象,获取系统当前日期,时间等操作 Date类: 位于java.util.Date,从JDK1.0起就存在了,但现在它的大部分构造器,方 ...
最新文章
- Node webkit启动最大化窗口
- 点云数据的类型主要分为_点云学习在自动驾驶中的研究概述
- 我是如何用Worktile进行敏捷开发的
- Redis 实战笔记
- 一致性 Hash 算法学习(分布式或均衡算法)
- MySQL Hardware--FIO压测
- 热敏电阻如何查表计算温度_额温枪温补算法:热电堆温度补偿算法 MTP10B7F55
- MySQL主从复制的原理及配置方法(比较详细)
- 机器学习-多项式回归、正规方程(标准方程)
- Linux下查看端口状态的小工具lsof
- STM32F429+W25Q256+TouchFGX
- 初识python之汇率转换篇
- 什么是软件项目管理?
- 绝对优势与比较优势的数学分析与其…
- 李梦恬爸爸分享之第十周课程资源
- 2023年全国最新交安安全员精选真题及答案4
- 用python绘制y=x,y=1+sinx,编写Python程序,使用numpy、pandas、matplotlib三个扩展库在一个画布中绘制4个子图.
- 无线个人通信(WPAN)-蓝牙
- Struts原理与实践
- CNI(Container Network Plugin)