序列化

序列化是指把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变量.

比如:
构造方法中会创建 bin


bin 他是DataInputStream的内部类 BlockDataInputStream
BlockDataInputStream内部还有两个变量分别是
DataInputStream 和PeekInputStream

其中的PeekInputStream也是内部类
输入流有两种模式:
在默认模式下,输入数据以与DataOutputStream相同的格式写入;
在“块数据”模式中,输入数据由块数据标记括起来(详细信息见对象序列化规范)。
缓冲依赖于块数据模式:在默认模式下,没有预先缓冲任何数据;当在块数据模式下,当前数据块的所有数据都立即读取(并缓冲)
标记位是DataBlockInputStream中的blkmode

在BlockDataInputStream中的方法,会根据这个标志位调用不同的方法
比如
总结:
ObjectInputStream中的方法很多调用BlockDataInputStream
BlockDataInputStream又会根据模式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配合进行使用的
看一下他们的构造方法你就知道了 


[九]JavaIO之ObjectInputStream 和 ObjectOutputStream的更多相关文章

  1. Java-IO之对象输入流输出流(ObjectInputStream和ObjectOutputStream)

    ObjectInputStream和ObjectOutputStream的作用是对基本数据和对象进行序列化操作支持.创建文件输出流对应的ObjectOutputStream对象,该ObjectOutp ...

  2. serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法

    ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 Ser ...

  3. 使用ObjectInputStream和ObjectOutputStream注意问题

    1.对象序列化,类实现Serializable接口 不需要序列化的属性,使用transient声明 2.使用套接字流在主机之间传递对象注意问题: 学习自:Socket同时使用ObjectInputSt ...

  4. java io系列05之 ObjectInputStream 和 ObjectOutputStream

    本章,我们学习ObjectInputStream 和 ObjectOutputStream ObjectInputStream 和 ObjectOutputStream 介绍 ObjectInputS ...

  5. Java之IO(七)ObjectInputStream和ObjectOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7003536.html 1.前言 本章介绍Java字节流中重要的成员,对象流ObjectInputStream和O ...

  6. ObjectInputStream与ObjectOutputStream类实现对象的存取

    1. ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 ...

  7. IO操作之ObjectInputStream与ObjectOutputStream

    之前写过DataInputStream和DataOutputStream,使用这两个类可以对java基本数据类型进行序列化和反序列化. 本篇再来两个新东西:ObjectInputStream,Obje ...

  8. Java IO: 序列化与ObjectInputStream、ObjectOutputStream

    作者:Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和O ...

  9. Java IO(六) ObjectInputStream 和 ObjectOutputStream

    Java IO(六) ObjectInputStream 和 ObjectOutputStream 一.介绍 对于对象数据的处理,Java IO 提供了 ObjectInputStream 和 Obj ...

随机推荐

  1. prometheus+grafana 监控生产环境机器的系统信息、redis、mongodb以及jmx

    介绍: 为了更好的对生产环境的一些中间件和操作系统的运行情况进行可视化的展示,近期了解了下prometheus加上grafana来实现这种效果,由于prometheus是新出来的开源项目,所以,监控的 ...

  2. VS 2013+ ArcGIS 10.3 AddIn 断点不断异常解决

    1. http://resources.arcgis.com/en/help/arcobjects-net/conceptualhelp/index.html#/How_to_debug_add_in ...

  3. Android Studio 直播弹幕

    我只是搬运:https://blog.csdn.net/HighForehead/article/details/55520199 写的很好很详细,挺有参考价值的 demo直通车:https://do ...

  4. 初次接触之R语言

    一.什么是R? 最受欢迎的数据分析和可视化平台之一. 其他分析平台:Excel.SPSS.SAS 二.为什么选择R? 免费.支持WINDOWS/MAC OS/Linux. 开源

  5. PDF转换成Word,ppt转换成word

    pdf与word我没找到直接转换的方式,不过可以用间接方式嘛! pdf ==>picture ==>word!ppt转word的原理也是先把ppt转成图片,再把图片插入word! 先准备好 ...

  6. 基于 TensorFlow 在手机端实现文档检测

    作者:冯牮 前言 本文不是神经网络或机器学习的入门教学,而是通过一个真实的产品案例,展示了在手机客户端上运行一个神经网络的关键技术点 在卷积神经网络适用的领域里,已经出现了一些很经典的图像分类网络,比 ...

  7. SQL 查询当前时间

    Mysql: select date_format(now(),'%Y-%m-%d'); Oracle: Oracle中如何获取系统当前时间进行语句的筛选是SQL语句的常见功能 获取系统当前时间dat ...

  8. [Swift]LeetCode122. 买卖股票的最佳时机 II | Best Time to Buy and Sell Stock II

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  9. [Swift]LeetCode732. 我的日程安排表 III | My Calendar III

    Implement a MyCalendarThree class to store your events. A new event can always be added. Your class ...

  10. [Swift]LeetCode842. 将数组拆分成斐波那契序列 | Split Array into Fibonacci Sequence

    Given a string S of digits, such as S = "123456579", we can split it into a Fibonacci-like ...