十五、序列化
发布网友
发布时间:2022-04-19 09:58
我来回答
共1个回答
热心网友
时间:2023-10-23 23:58
(1)序列化
将数据结构或者对象转换成二进制序列的过程
(2)反序列化
将序列化过程所生成的二进制序列转换成数据结构或者对象的过程
(3)持久化
将数据结构或者对象存储起来,如内存、磁盘。
进程之间、客户端和服务器之间数据的传输。因为传输过程只能传输二进制序列。
例如如下图:
在客户端和服务器之间网络数据传输的时候,我们可以选择Serializable序列化或者广义的json,xml,protbuf ,在安卓的进程之间通信的时候,可以选择Parcelable 序列化。
(1)Serializable
Java独有的序列化
(2) Parcelable
Android独有的序列
(3)广义的序列化
json,xml,protbuf .
对象通过实现Serializable接口或者Externalizable接口,Externalizable接口也是实现了Serializable接口
serialVersionUID通常是对象的哈希码,主要用于对象的版本控制唯一标识。
序列化和反序列化的时候类中的serialVersionUID一定要一致。如果序列化时的serialVersionUID和反序列化时的serialVersionUID不一样,将会抛出异常。举个例子
我们定义了Student 类中的serialVersionUID = 1,然后将其序列化到磁盘在反序列化出来的时候,不修改serialVersionUID
序列化和反序列化都成功
我们将serialVersionUID 改成2,再反序列化出来 试试
提示serialVersionUID 不一致的异常。
因此我们知道serialVersionUID控制了对象的版本,序列化和反序列化的时候serialVersionUID一定要一致。
当然我们也可以不写serialVersionUID,这样JVM会自动给我们添加上serialVersionUID的值。当类没有任何改变的时候,我们直接序列化和反序列化是正常的,但是假如我们在序列化之后,删除或者添加了类的某个成员,JVM就会修改serialVersionUID的值,就会导致和序列化时候的serialVersionUID不一致。这样我们在反序列化的时候就还会报serialVersionUID不一致的错误。因此当我们需要序列化对象的时候,一般手动设置serialVersionUID的值。
使用 transient 关键字修饰成员
如果序列化的对象没有包含这个成员,则正常,如果包含,则会报抛异常。
举例
Student中包含2个构造方法,其中User成员没有实现Serializable接口
我们先调用第一个构造方法创建对象然后序列化
没问题
调用第二个构造方法
直接抛出 java.io.NotSerializableException异常,我们只需将User实现Serializable接口即可
不会,反序列化生成对象是从二进制直接读出来的,然后再用Object 进行强转,不是原来的那个对象。
是一个深拷贝,前后对象的引用地址不一样