序列化与反序列化(Serializable与Parcelable)

前言:这几天在考虑写点啥笔记的时候,看到了有关于序列化的代码Serializable、Parcelable接口实现,突然意识到自己很久没关注这块的知识了,所以又给重新整理了一下相关的内容,感觉这个东西还是很有用的。希望今天整理的这篇 序列化与反序列化(Serializable与Parcelable) 文章对小伙伴有所帮助。概念简介序列化 :由于存在于内存中的变量都是暂时的,无法长期驻...
摘要由CSDN通过智能技术生成

前言:这几天在考虑写点啥笔记的时候,看到了有关于序列化的代码 SerializableParcelable 接口实现,突然意识到自己很久没关注这块的知识了,所以又给重新整理了一下相关的内容,感觉这个东西还是很有用的。希望今天整理的这篇 序列化与反序列化(Serializable与Parcelable) 文章对小伙伴有所帮助。

概念简介

序列化 :由于存在于内存中的变量都是暂时的,无法长期驻存,为了把对象的状态保持下来,把变量从内存中变成可存储或传输的过程就叫做序列化。
反序列化 :反序列化恰恰是序列化的反向操作,也就是说,把已存在在磁盘或者其他介质中的对象,反序列化(读取)到内存中,以便后续操作,而这个过程就叫做反序列化。

概括性来说序列化是指将对象实例的状态存储到存储媒体(磁盘或者其他介质)的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。

序列化的目的:

  1. 永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中)。
  2. 通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式)。
  3. 将对象数据在进程之间进行传递(Activity之间传递对象数据时,需要在当前的Activity中对对象数据进行序列化操作.在另一个Activity中需要进行反序列化操作讲数据取出)。
  4. Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长(即每个对象都在JVM中)。但在现实应用中,就可能要停止JVM运行,但有要保存某些指定的对象,并在将来重新读取被保存的对象。这时Java对象序列化就能够实现该功能。(可选择入数据库、或文件的形式保存)
  5. 序列化对象的时候只是针对变量进行序列化,不针对方法进行序列化.
  6. 在Intent之间基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了.

在Android中一个对象实现序列化操作,该类就必须实现了Serializable接口或者Parcelable接口,其中Serializable接口是在java中的序列化抽象类,而Parcelable接口则是android中特有的序列化接口。

下面就分别介绍一下Serializable和Parcelable。

Serializable类

首先简单介绍一下这个类:

public interface Serializable {
}

Serializable是一个标记接口,从上面的类中也可以看出来,他是一个空的接口。对于各种各样的类,我们需要有一个类来对他们进行统一。但是Java中是单根继承,而接口恰好弥补了这个地方。我们可以将实现的接口看做父类,这样通过Serializable类就实现了多种类的统一,同时为类打上了标签,可以通过instanceof Serializable判断是否能序列化。

使用Serializable实现类的序列化比较简单,只要在类声明中实现 Serializable 接口即可,同时强烈建议声明序列化标识serialVersionUID 。

友情提示:我们在实现Serializable时,类会有一个序列化的值,这个值默认的情况下会随我们Bean类中属性成员变化而变化,如果对类成员属性进行了修改,那么再次读取这个对象时,会因为UID不同而抛出异常。所以我们在实现Serializable接口同时,最好在类中声明UID。

serialVersionUID 是用来辅助序列化和反序列化过程的,原则上序列化后的对象中serialVersionUID只有和当前类的serialVersionUID相同才能够正常被反序列化,也就是说序列化与反序列化的serialVersionUID必须相同才能够使序列化操作成功。实际上我们不声明serialVersionUID也是可以的,因为在序列化过程中会自动生成一个serialVersionUID来标识序列化对象。

当一个类实现SerSerializable接口,没有添加serialVersionUID的作用字段时,IDE会发出警告,这个字段可以手动指定一个值,比如1L,也可指定为IED根据类的结构生成一个long值,它们的效果是一样的。在序列化时会将这个值写入存储介质,反序列化时就校验本地类的serialVersionUID和序列化介质中的是否一致,不一致将抛出异常 java.io.InvalidClassException。

异常信息如下:

java.io.InvalidClassException: StudentBean; local class incompatible: stream classdesc serialVersionUID = -8088515121892865631, local class serialVersionUID = 630907180238371889
	at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:687)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1883)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1749)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2040)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
	at java.io.ObjectInputStrea
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值