序列化

序列化是指把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. javascript 变量的引入、变量的声明、变量的初始化

    变量的引入及声明和初始化: 变量: 操作的数据都是在内存中操作 Js中存储数据使用变量的方式(名称,值--->数据) Js中声明变量都用var--->存储数据,数据应该有对应的数据类型 存 ...

  2. 动态设置bootstrapswitch状态

    checkbox的html <input type="checkbox" name="mySwitch" id="mySwitch"& ...

  3. VS2017Release+x64失败,LNK1104,无法打开文件"msvcprt.lib"

    采用VS2017+Qt5.10联合开发环境建立开发,将Qt的库包含到VS中使用VS2017的Debug+x64模式调试程序,通过并出现对应的EXE应用程序! 但是转换到Release+x64模式出现问 ...

  4. 浅谈开发中python通过os模块存储数据

    #其实本人很烦发博客,但为了面试还是发一下好,证明一下自己的能力 前言 首先说一下适用环境,在开发中我们有一些经常用到的数据(数据量大)需要存储起来. 存sql嘛又不合适,要知道在开发中每条sql语句 ...

  5. Web测试入门:Selenium+Chrome+Python+Mac OS

    一.环境配置 Chromedriver 下载及环境配置 url:使用WebDriver在Chrome浏览器上进行测试时,需要从http://chromedriver.storage.googleapi ...

  6. 如何用VSCode调试Vue.js

    VS Code相关插件:Chinese (Simplified) Language Pack for Visual Studio Code Debugger for Chrome ESLint Vet ...

  7. Java提高篇(二):IO字节流、字符流和处理流

    在我们的Java语言当中,通常会有对文件进行读写,因此我们引入java的IO类来进行文件的读写. 一.字节流 下面是一个字节流的实例: import java.io.*; public class I ...

  8. emWin万年历,含uCOS-III和FreeRTOS两个版本

    第8期:万年历配套例子:V6-914_STemWin提高篇实验_万年历(uCOS-III)V6-915_STemWin提高篇实验_万年历(FreeRTOS) 例程下载地址: http://forum. ...

  9. Java中CAS原理详解

    在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2 ...

  10. Apache Storm 核心概念

    前言: Storm读取实时数据流,并传递给处理单元,最终输出处理后的数据. 下图描述了storm的处理数据的主要结构. 元组(Tuple) :       元组是Storm提供的一个轻量级的数据格式, ...