序列化

序列化是指把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. 记录一种下载https网址中的mp4文件的方法

    需要下载一个网页中的视频, 页面中的视频播放器为 JW player, 通过搜索发现可以下载对应的视频. 1. 使用chrome浏览器分析 网页中的视频地址: F12或者右键-->检查, 在打开 ...

  2. 818C.soft thief

    Yet another round on DecoForces is coming! Grandpa Maks wanted to participate in it but someone has ...

  3. CF F. Shovels Shop(前缀和预处理+贪心+dp)

    F. Shovels Shop time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  4. 一致性Hash算法在数据库分表中的实践

    最近有一个项目,其中某个功能单表数据在可预估的未来达到了亿级,初步估算在90亿左右.与同事详细讨论后,决定采用一致性Hash算法来完成数据库的自动扩容和数据迁移.整个程序细节由我同事完成,我只是将其理 ...

  5. Ubuntu 16.04下安装搜狗输入法

    在确保更新了国内镜像源的前提下: 安装sogou输入法步骤 一.安装fcitx键盘输入法系统(系统已安装的可忽略此步骤) 1.添加以下源 sudo add-apt-repository ppa:fci ...

  6. High Availability手册(1): 环境

    三台KVM虚拟机 首先我们得有一个pacemaker的环境,需要三台机器,如果没有那么多物理机器,可以用kvm虚拟机 创建一个bridge ovs-vsctl add-br ubuntu_br ifc ...

  7. 微信小程序用户信息解密失败导致的内存泄漏问题。

    微信小程序获取用户解密的Session_key 然后对 encryptedData进行解密 偶尔报错 时间长了之后会报内存溢出: java.lang.OutOfMemoryError: GC over ...

  8. 大量示例彻底搞懂Linux查找,which,whereis,locate,find

    前言 Linux常用命令中,有些命令可以帮助我们查找二进制文件,帮助手册或源文件的位置,也有的命令可以帮助我们查找磁盘上的任意文件,今天我们就来看看这些命令如何使用. which which命令会在P ...

  9. [Swift]LeetCode241. 为运算表达式设计优先级 | Different Ways to Add Parentheses

    Given a string of numbers and operators, return all possible results from computing all the differen ...

  10. [Swift]LeetCode970.强整数 | Powerful Integers

    Given two non-negative integers x and y, an integer is powerful if it is equal to x^i + y^j for some ...