欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【Java】Java深入理解io篇—数据流,对象流和序列化

程序员文章站 2022-03-19 16:34:07
【Java】Java深入理解io篇(四) —数据流,对象流和序列化深入理解IO篇(如有错误,请各位大佬多多指正)【Java】Java深入理解io篇(一)—全篇概览:https://blog.csdn.net/qq_45495857/article/details/110260909【Java】Java深入理解io篇(二)—四大抽象类: https://blog.csdn.net/qq_45495857/article/details/110260984【Java】Java深入理解io篇(三)—缓冲...

【Java】Java深入理解io篇(四) —数据流,对象流和序列化

深入理解IO篇(如有错误,请各位大佬多多指正)
【Java】Java深入理解io篇(一)—全篇概览:https://blog.csdn.net/qq_45495857/article/details/110260909
【Java】Java深入理解io篇(二)—四大抽象类: https://blog.csdn.net/qq_45495857/article/details/110260984
【Java】Java深入理解io篇(三)—缓冲流和标准IO:https://blog.csdn.net/qq_45495857/article/details/110261113
【Java】Java深入理解io篇(四) —数据流,对象流和序列化:https://blog.csdn.net/qq_45495857/article/details/110261213

1.数据流:

数据流将“基本数据类型与字符串类型”作为数据源,从而允许程序以与机器无关的方式从底层输入输出流中操作Java基本数据类型与字符串类型

DataInputStream和DataOutputStream是处理流,可以对其他节点流或处理流进行包装,增加一些更灵活、更高效的功能。

注意:

使用数据流时,读取的顺序一定要与写入的顺序一致,否则不能正确读取数据

2.对象流

数据流只能实现对基本数据类型和字符串类型的读写,并不能读取对象(字符串除外),如果要对某个对象进行读写操作,我们需要学习一对新的处理流:

ObjectInputStream/ObjectOutputStream是以“对象”为数据源,但是必须将传输的对象进行序列化与反序列化操作

注意

  1. 对象流不仅可以读写对象,还可以读写基本数据类型。

  2. 使用对象流读写对象时,该对象必须序列化与反序列化。

  3. 系统提供的类(如Date等)已经实现了序列化接口,自定义类必须手动实现序列化接口。

序列化

当你创建对象时,只要你需要,他就会一致存在,但是程序终止时,无论如何他都不会继续存在,尽管这么做肯定是有意义的,但是仍旧存在某些情况,如果对象能够在程序不运行的情况下仍能存在并保存信息,那将非常有用。

把Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。

Java的对象序列化将那些实现了Serizlizable 接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复成原来的对象

可以利用对象的序列化实现“轻量级持久性”,“持久性”意味着一个对象的生命周期并不取决与程序是否执行,他可以生存与程序的调用之间

对象序列化的概念加入到语言中为了支持两种主要特性:

  1. Java的远程方法调用,它使存活于其他计算机上的对象使用起来就像是存活于本机上一样,当向远程对象发送消息时,需要通过对象序列化来传输参数和返回值
  2. 对于Java Beans来说,对象的序列化是必须的。使用一个bean时,一般情况下是在设计阶段对它的状态信息进行配置,这种状态信息必须保存下来,并在程序启动时进行后期恢复;这种具体的工作是由对象序列化完成的

对象序列化特别“聪明”的一个地方是它不仅保存了对象的全景图,而且能追踪对象内所包含的所有引用,并保存那些对象,接着又能对对象内包含的每个这样的引用进行追踪,依次类推。这种情况有时被成为“对象网”

注意

  1. static属性不参与序列化。

  2. 对象中的某些属性如果不想被序列化,不能使用static,而是使用transient修饰。

  3. 为了防止读和写的序列化ID不一致,一般指定一个固定的序列化ID。

本文地址:https://blog.csdn.net/qq_45495857/article/details/110261213