两个activity之间需要传对象的话就需要实现序列化接口了就行了。
为什么要实现序列化接口,你可以当这个是android的一个机制,就是得这么办,不这么办不行。
实际上实现序列化接口就是为了让数据能变成一种可存储或可传输的状态,可以传输到网络,也可以传输到本地。所以activity之间,你要是不实现序列化接口,那么你在SecondActivity中操作FirstActivity中的数据必将会导致内存泄露。
java中的实现序列化的方式有两种
1实现Serializable接口
2.实现Parcelable 接口
关于这两个接口的区别呢,在这里正好回忆一下吧
从写代码上来说:
Serializable:实现这个非常简单,直接 implement 就完了,什么都不用写,当然 你要是想写,声明一个 serialVersionUID 变量 就ok了,
serialVersionUID 的话 Android Studio 默认是不会自动生成的,你需要配置一下:
File -> Settings -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID' 勾上 然后 apply 、ok 就好了。
代码上实现Serialazable就是这么的简单
Parcelable:这个的话就有点复杂了,你需要 implement 这个 接口 然后 重写
构造方法 (传入Parcel对象)
descirbeContents方法
writeToParcel方法
创建一个Parcelable.Creator对象
Android Studio 有 生成Parcelable的插件 可以直接导入插件:File -> Setting -> Plugins -> Browse Respositories 然后搜索 Parcelable 安装
,就可以直接在model里一键导入Parcelable接口了,可以省去很大一部分时间
从实际使用角度上来看:
1.使用内存的使用,Parcelable比Serializable性能高,Parcelable效率更高,Parcelable底层实现是内存的copy,速度很快,Serializable是IO操作,而且会用到反射,相对比较慢,国外有人测试过,Parcelable比Serializable从序列化到传输到反序列化,平均要快10倍左右
2.Serializable在序列化时会产生大量的临时变量,引起频繁GC,Parcelable要序列化哪些字段,我们完全可以控制,而且还可以在其中加入各种转换,修饰,因为写接口暴露给我们了,我们可以自由定制,而Serializable就显的比较笨拙,而且需要一些额外的字节来存储类的信息,当然Serializable使用起来要更简单
3.Parcelable不能使用在要将数据存储在磁盘的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。
下面说一下自己的错误。。
从网络上得到的数据 然后 我实现了Serializable接口 传递到第二个activity中,结果突然给我报了一个:Parcelable encountered IOException writing serializable object
然后查看自己的代码,发现并没有实现Parcelable接口啊,然后想到以前好像见过这个异常,是因为内部分没有实现Serializable接口,但是回到代码一看,虽然有内部类,但是我也实现了Serializable接口了啊,为什么还会报这个异常呢?!!!
。。。。。
然后找了好久才发现是因为自己的model类中有一个Bitmap对象,,这个对象本身已经实现了Parcelable接口。。所以才会出现那个异常,然后直接把类改为实现Parcelable接口,然后运行,果然好了。
对了,我们最好不要直接传Bitmap对象,因为如果Bitmap尺寸过大的话就会引起崩溃,以前试过应该是大于512k就会crash掉。所以我们最好把Bitmap缓存下来直接传路径就可以了

本文深入探讨了Android中实现序列化的两种方式:Serializable和Parcelable接口。对比了这两种方式在代码实现难度、性能表现及应用场景上的差异,并通过实例讲解了在实际项目中如何选择合适的序列化方式。
3294

被折叠的 条评论
为什么被折叠?



