【Java】Java深入理解io篇(四) —数据流,对象流和序列化
1.数据流:
数据流将“基本数据类型与字符串类型”作为数据源,从而允许程序以与机器无关的方式从底层输入输出流中操作Java基本数据类型与字符串类型
DataInputStream和DataOutputStream是处理流,可以对其他节点流或处理流进行包装,增加一些更灵活、更高效的功能。
注意:
使用数据流时,读取的顺序一定要与写入的顺序一致,否则不能正确读取数据
2.对象流
数据流只能实现对基本数据类型和字符串类型的读写,并不能读取对象(字符串除外),如果要对某个对象进行读写操作,我们需要学习一对新的处理流:
ObjectInputStream/ObjectOutputStream是以“对象”为数据源,但是必须将传输的对象进行序列化与反序列化操作
注意
对象流不仅可以读写对象,还可以读写基本数据类型。
使用对象流读写对象时,该对象必须序列化与反序列化。
系统提供的类(如Date等)已经实现了序列化接口,自定义类必须手动实现序列化接口。
序列化
当你创建对象时,只要你需要,他就会一致存在,但是程序终止时,无论如何他都不会继续存在,尽管这么做肯定是有意义的,但是仍旧存在某些情况,如果对象能够在程序不运行的情况下仍能存在并保存信息,那将非常有用。
把Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。
Java的对象序列化将那些实现了Serizlizable 接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复成原来的对象
可以利用对象的序列化实现“轻量级持久性”,“持久性”意味着一个对象的生命周期并不取决与程序是否执行,他可以生存与程序的调用之间
对象序列化的概念加入到语言中为了支持两种主要特性:
Java的远程方法调用,它使存活于其他计算机上的对象使用起来就像是存活于本机上一样,当向远程对象发送消息时,需要通过对象序列化来传输参数和返回值
对于Java Beans来说,对象的序列化是必须的。使用一个bean时,一般情况下是在设计阶段对它的状态信息进行配置,这种状态信息必须保存下来,并在程序启动时进行后期恢复;这种具体的工作是由对象序列化完成的
对象序列化特别“聪明”的一个地方是它不仅保存了对象的全景图,而且能追踪对象内所包含的所有引用,并保存那些对象,接着又能对对象内包含的每个这样的引用进行追踪,依次类推。这种情况有时被成为“对象网”
注意
static属性不参与序列化。
对象中的某些属性如果不想被序列化,不能使用static,而是使用transient修饰。
为了防止读和写的序列化ID不一致,一般指定一个固定的序列化ID。
本文地址:https://blog.csdn.net/qq_45495857/article/details/110261213
希望与广大网友互动??
点此进行留言吧!