[九]JavaIO之ObjectInputStream 和 ObjectOutputStream

序列化

序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程

序列化是一种轻量级的持久化,对象都是存活在内存中的,当JVM运行结束,对象便不存在了

如果想要对象还能够存在,或者说当你在网络中想要进行对象数据的传输的话,就需要进行序列化

说白了就是内存中的数据你要把他变成字节

ObjectInputStream 和 ObjectOutputStream就是java原生的用于处理序列化的功能

ObjectStreamConstants

写入 Object Serialization Stream 的常量比如http请求似的,会有很多附加信息请求头,class文件有他的文件信息类似的道理序列化也会写入一些除了直接数据信息以外的格式等相关的信息这部分常量的值就在这个接口中

DataInput

接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构

ObjectInput

DataInput 包括基本类型的输入方法 扩展了DataInput接口,以包含对象、数组和 String

DataOutput

接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流

ObjectOutput

DataOutput 包括基本类型的输出方法; 扩展了DataOutput接口,以包含对象、数组和 String

从上面的类层次结构以及其他辅助类的说明上可以看得出来ObjectStreamConstants 约定了所有序列化时用到的常量信息DataInput以及ObjectInput 都是接口,约定了从二进制读取基本类型 对象 数组 String的方法DataOutput以及 ObjectOutput也都是接口,约定了将基本类型数据 对象  数组 String  转换为字节写入二进制流的方法

ObjectInputStream 和 ObjectOutputStream 相当于继承了两个体系一个体系是IO的读写方法约定另一个是从二进制读取为数据或者数据编写二进制 两个体系结构的实现,构成了现在的ObjectInputStream 和 ObjectOutputStream 从下图看得出来除了标记的以外,其中绝大多数方法都来自于DataInput     DataOutput

可以看一下关于DataInputStream以及DataOutputStream的介绍 其实完全可以看得出来,DataInputStream以及DataOutputStream他们两个也算是序列化 只不过他们不支持对象  数组 String 仅仅支持基本类型,功能不够强大,使用也不够方便 java原生的序列化不就是  基本类型/对象/数组/String  与 二进制字节流的相互转换嘛

ObjectInputStream

ObjectInputStream中的方法大多依赖于bin变量.

比如:

构造方法中会创建 binbin 他是DataInputStream的内部类 BlockDataInputStreamBlockDataInputStream内部还有两个变量分别是DataInputStream 和PeekInputStream

其中的PeekInputStream也是内部类

输入流有两种模式:在默认模式下,输入数据以与DataOutputStream相同的格式写入;在“块数据”模式中,输入数据由块数据标记括起来(详细信息见对象序列化规范)。缓冲依赖于块数据模式:在默认模式下,没有预先缓冲任何数据;当在块数据模式下,当前数据块的所有数据都立即读取(并缓冲)标记位是DataBlockInputStream中的blkmode在BlockDataInputStream中的方法,会根据这个标志位调用不同的方法比如

总结:ObjectInputStream中的方法很多调用BlockDataInputStreamBlockDataInputStream又会根据模式blkmode 的值去调用实际的方法可能是BlockDataInputStream自己实现的方法也可能是PeekInputStream实现的方法

ObjectOutputStream

ObjectOutputStream的整体思路其实也是类似于ObjectInputStream的

它内部也有一个跟BlockDataInputStream  对应的BlockDataOutputStream

不再详细介绍

总结

ObjectInputStream 和 ObjectOutputStream 是java原生的序列化以及反序列化类

算是DataInputStream和DataOutputStream的超集(功能上的超集,不是父类)

DataXXX只能处理基本类型,ObjectXXX可以处理 基本类型以及对象 数组 String

DataInput/ObjectInput

DataOutput/ObjectOutput

这四个接口定义了序列化的协议,各种方法的定义

ObjectInputStream 和 ObjectOutputStream  遵循了IO InputStream 和 OutputStream的约定,提供IO的读写方式

并且遵守了DataOutput/ObjectOutput的约定,提供了更多的可以用于 数据与二进制字节转换的读写方法

实际开发使用时只需要关注可以使用的方法即可

ObjectInputStream 和 ObjectOutputStream可以理解为实现了序列化的功能的一个工具

所以你必须依托于InputStream 或者OutputStream

通常是和FileInputStream 和 FileOutputStream配合进行使用的

看一下他们的构造方法你就知道了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏noteless

[二十]JavaIO之StringReader 与 StringWriter

还记得前面说过的CharArrayReader 和 CharArrayWriter吗?

36830
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十三天 IO-打印流&序列化流&Properties&CommonsIO&流总结【悟空教程】

第二十三天 IO-打印流&序列化流&Properties&CommonsIO&流总结【悟空教程】

10820
来自专栏杨建荣的学习笔记

MySQL数值类型在binlog中需要注意的细节(r12笔记第69天)

MySQL里的数值类型分得很细,光整型数据就有多种数据类型。tinyint,smallint,mediumint,int(integer),还有范围最大...

36070
来自专栏九彩拼盘的叨叨叨

JavaScript 数组练习题之实现

** 题 3:改变传入的数组,将数组中第 n(从 0 开始算 ) 个元素放到数组的开头 **

13010
来自专栏曾大稳的博客

c基础

11310
来自专栏北京马哥教育

Awk是什么?一文带运维小白快速掌握Linux Awk用法

作者:a8 Awk、sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和aw...

40160
来自专栏公众号_薛勤的博客

Eclipse MAT内存分析工具(Memory Analyzer Tool)

MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器。可以用于查找内存泄露以及查看内存消耗情况。MAT是基于Eclipse开发的...

1.6K30
来自专栏北京马哥教育

可能是最全面的 Python 字符串拼接总结

在 Python 中字符串连接有多种方式,这里简单做个总结,应该是比较全面的了,方便以后查阅。

11700
来自专栏Java后端技术栈

那些鲜为人知的序列化和反序列化底层实现原理!

序列化和反序列化作为Java里一个较为基础的知识点,大家心里也有那么几句要说的,但我相信很多小伙伴掌握的也就是那么几句而已,如果再深究问一下Java如何实现序列...

9320
来自专栏java相关

【PL/SQL编程基础】

13840

扫码关注云+社区

领取腾讯云代金券