十五、序列化

发布网友 发布时间: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 进行强转,不是原来的那个对象。

是一个深拷贝,前后对象的引用地址不一样

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
15.587674s