我们经常对某类需要进行序列化和反序列时,常会去实现一个Serializable。下面对这个实例化及serialVersionUID进行说明。
public class Response<T> implements Serializable {
private static final long serialVersionUID = 3416847828834844307L;
private T result;
private String msg;
private Integer code;
}
- 为什么要进行序列化
序列化的主要作用是对类进行版本控制。序列化之后的类可以转化为Byte流,然后又能反序列化成原始的类,又能在网络进行传输,也能保存在磁盘中,有了SUID之后,那么如果序列化的类已经保存了在本地中,中途你更改了类后,SUID变了,那么反序列化的时候就不会变成原始的类了,还会抛异常。
- SerialVersionUID的英文介绍
SerialVersionUID is an ID which is stamped on object when it get serialized usually hashcode of object, you can use tool serialver to see serialVersionUID of a serialized object . SerialVersionUID is used for version control of object. you can specify serialVersionUID in your class file also. Consequence of not specifying serialVersionUID is that when you add or modify any field in class then already serialized class will not be able to recover because serialVersionUID generated for new class and for old serialized object will be different. Java serialization process relies on correct serialVersionUID for recovering state of serialized object and throws java.io.InvalidClassException in case of serialVersionUID mismatch.
- serialVersionUID的作用
serialVersionUID类似于一个类的身份证,唯一标识一个类。有两种生成方式,一种是默认值,private static final long serialVersionUID = 1L(也可以正常反序列化,但不推荐,毕竟UID的值与实际不符。);还有一种是自动生成的方式,根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段。IDEA默认不会生成serialVerisonUID,可以参考这篇文章进行配置:https://blog.csdn.net/weinichendian/article/details/79813554
- 为什么只有序列化的对象才能进行持久化和在网络上传输
对象存入文件或者数据库叫做持久化。在持久化前需要先序列化。序列化的含义就是将层次的数据(一个对象包含很对字段,如果字段本身是对象,它还有它的字段,这个结构类似一颗树)变成扁平的,序列的数据。无论是写文件还是网络传输,都必须将数据变成一串,或者说一个序列,这就是序列化的含义。内存里可以直接访问对象,修改对象,但是到了流里就必须序列化后才能保存对象,比如写入文件,通过网络传输等,有时必须手工序列化,有时他是自动会序列化,无需手工序列化,但最终只要看到的是二进制内容,就都是序列化过的了。