
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Java编程开发语言是目前大多数软件开发程序员都在学习和使用的一种编程语言,今天我们就通过案例分析来简单了解一下,Java序列化与反序列化基础知识分享。
Java序列化是指把Java对象转换为字节序列的过程;这串字符可能被储存/发送到任何需要的位置,在适当的时候,再将它转回原本的Java对象,而Java反序列化是指把字节序列恢复为Java对象的过程。
为什么需要序列化与反序列化
当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等,而这些数据都会以二进制序列的形式在网络上传送。那么当两个Java进程进行通信时,能否实现进程间的对象传送呢?答案是可以的。如何做到呢?这就需要Java序列化与反序列化了。换句话说,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出Java对象
Java提供了两个类java.io.ObjectOutputStream和java.io.ObjectInputStream来实现序列化和反序列化的功能,其中ObjectInputStream用于恢复那些已经被序列化的对象,ObjectOutputStream将Java对象的原始数据类型和图形写入OutputStream。
在Java的类中,必须要实现java.io.Serializable或java.io.Externalizable接口才可以使用,而实际上Externalizable也是实现了Serializable接口
ObjectOutputStream
ObjectOutputStream继承的父类或实现的接口如下:
父类OutputStream:所有字节输出流的顶级父类,用来接收输出的字节并发送到某些接收器(sink)。
接口ObjectOutput:ObjectOutput扩展了DataOutput接口,DataOutput接口提供了将数据从任何Java基本类型转换为字节序列并写入二进制流的功能,ObjectOutput在DataOutput接口基础上提供了writeObject方法,也就是类(Object)的写入。
接口ObjectStreamConstants:定义了一些在对象序列化时写入的常量。常见的一些的比如STREAM_MAGIC、STREAM_VERSION等。
通过这个类的父类及父接口,我们大概可以理解这个类提供的功能:能将Java中的类、数组、基本数据类型等对象转换为可输出的字节,也就是反序列化。接下来看一下这个类中几个关键方法
writeObject
这是ObjectOutputStream对象的核心方法之一,用来将一个对象写入输出流中,任何对象,包括字符串和数组,都是用writeObject写入到流中的。
之前说过,序列化的过程,就是将一个对象当前的状态描述为字节序列的过程,也就是Object->OutputStream的过程,这个过程由writeObject实现。writeObject方法负责为指定的类编写其对象的状态,以便在后面可以使用与之对应readObject方法来恢复它
writeUnshared
用于将非共享对象写入ObjectOutputStream,并将给定的对象作为刷新对象写入流中。
使用writeUnshared方法会使用BlockDataOutputStream的新实例进行序列化操作,不会使用原来OutputStream的引用对象。
writeObject0
writeObject和writeUnshared实际上调用writeObject0方法,也就是说writeObject0是上面两个方法的基础实现。具体的实现流程将会在后面再进行详细研究。
writeObjectOverride
如果ObjectOutputStream中的enableOverride属性为true,writeObject方法将会调用writeObjectOverride,这个方法是由ObjectOutputStream的子类实现的。
在由完全重新实现ObjectOutputStream的子类完成序列化功能时,将会调用实现类的writeObjectOverride方法进行处理。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。