Parcelable 与 Serializable

Unchecked cast java.io.Serializable to ……

在清理警告时遇到了问题:
Activity之间传递List会出现警告,如下:


Parcelable 与 Serializable_第1张图片
Unchecked cast: 'java.io.Serializable' to 'java.util.List'
pictureInfoList = (List) getIntent().getSerializableExtra("editor_picture");

我用了Serializable使PictureInfo类序列化

implements Serializable

传递就有此警告,于是在 这里查到了原因【需要翻墙】

大致意思就是需要使用性能更好,内存开销更少的Parcelable

使用Parcelable消除了警告。

Parcelable

//传入时
List pictureInfoList= mList.get(position).getPictureInfo();
ArrayList maList = new ArrayList<>(pictureInfoList);
Intent editor = new Intent(MainActivity.this,CommodityUploadActivity.class);
editor.putParcelableArrayListExtra("editor_picture",maList);
startActivity(editor);
//取出时
List pictureInfoList = getIntent().getParcelableArrayListExtra("editor_picture");

Parcelable的使用没Serializable那么简单,但是也有捷径可走。
安装插件:

Parcelable 与 Serializable_第2张图片
安装插件

然后
Parcelable 与 Serializable_第3张图片

OK~然后用就行了


ParcelableSerializable区别

两者的实现差异:

Serializable的实现,只需要实现Serializable接口即可。这只是给对象打了一个标记(UID),系统会自动将其序列化。而Parcelabel的实现,不仅需要实现Parcelabel接口,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator接口,并实现读写的抽象方法。

两者的设计初衷:

Serializable的设计初衷是为了序列化对象到本地文件、数据库、网络流、RMI以便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是由于Serializable效率过低,消耗大,而android中数据传递主要是在内存环境中(内存属于android中的稀有资源),因此Parcelable的出现为了满足数据在内存中低开销而且高效地传递问题。

两者的效率选择:

Parcelable的性能比Serializable好,在内存开销方面较小,所以Android应用程序在内存间数据传输时推荐使用Parcelable,如activity间传输数据和AIDL数据传递,而Serializable将数据持久化的操作方便,因此在将对象序列化到存储设置中或将对象序列化后通过网络传输时建议选择SerializableParcelable也是可以,只不过实现和操作过程过于麻烦并且为了防止android版本不同而导致Parcelable可能不同的情况,因此在序列化到存储设备或者网络传输方面还是尽量选择Serializable接口)。

两者需要注意的共同点:

无论是Parcelable还是Serializable,执行反序列操作后的对象都是新创建的,与原来的对象并不相同,只不过内容一样罢了。

详细的内容参见序列化与反序列化之Parcelable和Serializable浅析

你可能感兴趣的:(Parcelable 与 Serializable)