什么是Java序列化
Java提供了两种对象持久化的方式,分别为序列化和反序列化。
(1)序列化:
在分布式环境下,当进行远程通信时,无论何种类型的数据,都会以二进制序列的形式在网络上传送。序列化是一种将对象一连串的字节描述的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库系统里,并在需要时把该流读取出来重新构造一个相同的对象。
所有要实现序列化的类都必须实现Serializable接口,serializable接口位于Java.lang包中,它里面没有包含任何方法。使用一个输出流来构造一个objectoutputStream对象,紧接着,使用该对象的writeObject方法可以将obj对象写出来,要恢复时可以使用其对应的输入流。
特点:1.一个类被序列化,那么他的子类也能够被序列化。
2.由于static代表类的成员,transient代表对象的临时数据,因此被声明为这两种类型的数据成员是不能被序列化的。
3.Java提供了多个对象序列化的接口:objectOutput、Objectput、ObjectOutStream和ObjectPutStream.
4.由于序列化的使用会影响系统的性能,因此如果不是必须使用序列化,应尽可能不要使用序列化。那么在什么情况下需要使用序列化呢?
1.需要通过网络来发送对象,或对象的状态需要被持久化到数据库或文件中。
2.序列化能实现深复制,即可以复制引用的对象(复制的不是一个对象)。
与序列化相对的是反序列化,它将流转换成对象。在序列化和反序列化的过程中serialVersionUID起着非常重要的作用。
1.提高程序的运行效率
2.提高程序不同平台上的兼容性
3.增强各个版本的可兼容性
3.外部序列化:外部序列化与序列化主要的区别在于序列化是内置的API只需要实现Serializable接口,而外部序列化时使用Externalizable接口,接口的方法由开发人员实现。