Serializable序列化以及什么是序列化

在计算机中,一些数据都是以二进制流的形式存在的,比如网络之间数据的通信使用的是二进制流,本地数据保存也是二进制流。这里说个概念,将数据保存到本地磁盘的过程叫“持久化”。


但是在java中,一个java类是以一个对象的形式存在的,所以如果要将这个对象保存在本地或者将这个对象与其他进程或者在网络之间通信,就需要将他们转为二进制流,而将一个对象转为二进制的过程就叫做序列化,反之,将一个二进制转换为一个对象就叫做反序列化。


在Java中,我们需要序列化一个对象,首先要声明这个对象可以被序列化,这个步骤是通过实现Serializable接口来实现的,将类实现Serializable即可,Serializable是空接口,当实现该接口后,可以通过ObjectOutputStream对其进行序列化,通过ObjectInputStream对其进行反序列化。


当一个对象实现Serializable之后,再进行序列化操作,系统会自动判断该对象是否有serialVersionUID参数,如果没有则将该对象的hash值赋值给该参数,然后底层会自动序列化该对象,并将serialVersionUID写入到序列化文件中。


serialVersionUID的作用是用于标识该对象,在反序列化的时候需要用到,我们可以手动在类中声明该变量并赋值,也可以忽略它。


反序列化的过程中,java会读取序列化文件的UID,并与对象UID进行比对,如果不相同就反序列化失败。所以我们知道如果我们不赋值UID,那么这个UID是这个类的hash,那么如果我们稍微改了下这个类,这个hash就变了,那么反序列化匹配就不成功了,所以需要反序列化还是最好加上UID。


你可能感兴趣的:(Serializable序列化以及什么是序列化)