Parcelable与 Serializable

2024-02-02 03:58
文章标签 serializable parcelable

本文主要是介绍Parcelable与 Serializable,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

Parcelable与 Serializable功能对比

1.Parcelable与 Serializable 都可以实现安卓数据的序列化

2.Parcelable 是安卓专用序列化方式,开销比较小,使用麻烦,效率高;Serializable是java序列化方式使用简单需要大量I/O操作,效率低

3.Serializable 序列化可以把数据存储在外存中,保存数据相对于Parcelable放在data 目录下更加持久

4.使用Serializable 需要留意serialVersionUID 当版本对不上的时候,Bean增删改或者包全类名更改,可能造成readObject出错 java.io.InvalidClassException 错误,可参见:https://blog.csdn.net/u011607686/article/details/78933856

建议:安卓尽量使用Parcelable,以减少开销,提高新能,因为大量的I/O操纵会消耗CPU,CPU使用频率过大,会影响MainActivityThread (主线程) 绘制的效率,有可能造成UI卡顿,防微杜渐.如果需要在卸载APP后继续使用本地的数据,就要考虑使用Serializable 或者把数据存储在sqlite中,记得把表建在外存中.

1.Serializable 使用

 

java Bean:

public class SBean implements Serializable {public String name;public int age;public SBean(String name, int age) {this.name = name;this.age = age;}
}

 

序列化本地使用方法:

序列化

 try {String fileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/AMI/" + "file.text";File file = new File(fileName);SBean sBean = new SBean("李四", 24);ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));objectOutputStream.writeObject(sBean);objectOutputStream.close();} catch (IOException e) {e.printStackTrace();}

反序列化

  ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/AMI/" + "file.text"));SBean sBean = (SBean) objectInputStream.readObject();objectInputStream.close();

对象传递使用方法:

 

        Intent intent = new Intent();SBean sBean = new SBean("李四", 24);intent.putExtra("data", sBean);setIntent(intent);intent.setClass(this, SecondActivity.class);startActivity(intent);
 SBean data = (SBean) getIntent().getSerializableExtra("data");

2.Parcelable 使用

java Bean:

public class Bean implements Parcelable {public String name;public int age;public Bean(String name, int age) {this.name = name;this.age = age;}public Bean(Parcel parcel) {this.name = parcel.readString();this.age = parcel.readInt();}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel parcel, int i) {parcel.writeString(name);parcel.writeInt(age);}// 反序列过程:必须实现arcelable.Creator接口类,类名必须为CREATORpublic static Parcelable.Creator<Bean> CREATOR = new Creator<Bean>() {@Overridepublic Bean createFromParcel(Parcel parcel) {//序列化对应的类型return new Bean(parcel.readString(), parcel.readInt());}@Overridepublic Bean[] newArray(int i) {return new Bean[i];}};}

 

方法功能
 createFromParcel(Parcel parcel)从序列化后的对象中创建原始对象
newArray(int i)创建指定长度的原始对象数组
Bean(Parcel parcel)从序列化后的对象中创建原始对象
writeToParcel(Parcel parcel, int i)

将当前对象写入序列化结构中,其中i有两种类型:0或1.

1(PARCELABLE_WRITE_RETURN_VALUE)即标识当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况为0

describeContents()返回当前对象描述,如果含有文件描述返回1(CONTENTS_FILE_DESCRIPTOR),否则返回0
        Bean bean = new Bean("张三", 23);Intent intent = new Intent();intent.setClass(this, SecondActivity.class);intent.putExtra("data", bean);startActivity(intent);
Bean bean = getIntent().getParcelableExtra("data");

Parcelable  序列化到本地与反序列化可参见:https://blog.csdn.net/jielundewode/article/details/78342191

这篇关于Parcelable与 Serializable的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/669398

相关文章

Serializable的好处

任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。 import java.io.Serializable;import java.util.Arrays;import java.util.HashMap;import java.util.Map;public

DTO类实现Serializable接口的重要性

所谓序列化,简单一点理解,就是将对象转换成字节数组,反序列化是将字节数组恢复为对象。凡是要在网络上传输的对象、要写入文件的对象、要保存到数据库中的对象都要进行序列化。Java对象是无法直接保存到文件中,或是存入数据库中的。如果要保存到文件中,或是存入数据库中,就要将对象序列化,即转换为字节数组才能保存到文件中或是数据库中。文件或者数据库中的字节数组拿出来之后要转换为对象才能被我们识别,即反序列化。

Android ObjectOutputStream Serializable引发的血案

遇到一个问题 安装后第二次进app,闪退重现步骤[前置条件]打包分支:dev_7.13手机:vivo NEX 8.1.0[步骤]安装三星app----同意用户协议进入书城---连续点击back退出app---再次进入三星阅读[结果]出现闪退(必现)[期望]能正常进入书城附件 查看了日志,没有crash 相关的信息。那么我就相信,应该是自己程序里面的杀死了进程。 根据日志,果然是

Android中Parcelable序列化总结

在使用Parcelable对android中数据的序列化操作还是比较有用的,有人做过通过对比Serializable和Parcelable在android中序列化操作对象的速度比对,大概Parcelable相比Serializable要快10倍左右、、、给一个连接可以瞅瞅他们序列化的区别http://greenrobot.me/devpost/android-parcelable-seriali

为何 JavaBean 要实现 serializable 接口?

Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象时候,你就能把这些byte数据恢复出来,并据此重新构建那个对象了。这一点甚至在跨网络的环境下也是如此,这就意味着序列化机制能自动补偿操作系统方面的差异。也就是说,你可以在Windows机器上创键一个对象,序列化之后,再通过网络传到Unix机器上,然后在那里进行重建。你不用担心在不同

【Android 】序列化对象接口Parcelable使用方法

什么是Parcelable ?      Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。 Parcelable 传递对象     Android序列化对象主要有两种方法:     1.实现Serializable接口,实现S

Android 进阶6:两种序列化方式 Serializable 和 Parcelable

什么是序列化 我们总是说着或者听说着“序列化”,它的定义是什么呢? 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可

关于实现Serializable 接口的类中的SerialVersionUID问题

当一个类实现了Serializable接口时,表明该类可以被序列化,这个时候Eclipse会要求你为该类定义一个字段,该字段名字为serialVersionUID,类型为long,提示信息如下: The serializable clss Student4 does not declare a static final serialVersionUID field of type long

Android序列化-Serializable和Parcelable

总要说两句   在日常的应用开发中,我们可能需要让某些对象离开内存空间,存储到物理磁盘,以便长期保存,同时也能减少对内存的压力,而在需要时再将其从磁盘读取到内存,比如将某个特定的对象保存到文件中,隔一段时间后再把它读取到内存中使用,那么该对象就需要实现序列化操作,在java中可以使用Serializable接口实现对象的序列化,而在android中既可以使用Serializable接口实现对象序

。。。1、对于Serializable的子类!!!

对于实现Serializable的子类,该子类中的属性类型必须全部都是已经实现Serializable的子类。 如: public class User implements Serializable { String name; // public PackageManager pm; //PackageManager 因为没有实现Serializable接口,所以运行时会抛异常!! }