Android系统中Parcelable和Serializable处理
来源:互联网 发布:吉林省网络发票系统 编辑:程序博客网 时间:2024/04/29 15:32
android开发过程中需要对一些对象进行传递,但是要对数据进行传递需要对所传对象进行序列化,而java也提供了相应的类来处理,下面对Parcelable和Serializable做一下简单的介绍。
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化
//对数组对象的读出
Parcelable[] pars = in.readParcelableArray(Test1.class.getClassLoader());
test1s = Arrays.asList(Arrays.asList(pars).toArray(new Test1[pars.length]));
parcel.writeString(name);
parcel.writeParcelable(test1, i);
parcel.writeParcelableArray(test1s.toArray(new Test1[test1s.size()]), i);
针对网上有很多人在对对象序列化时test1 = in.readParcelable(null);也可能出现这样的错误,所以原理理解好是快速编码的关键,然后就是认证的编码然后序列化的顺序要一致。
1、Parcelable和Serializable都是java中对数据进行序列化的
Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化
2、下面介绍一下不同情况下的实现以及容易出现的问题
public class Test implements Parcelable { String name; Test1 test1; List<Test1> test1s; /** * 将数据读出,要求写入的数据和读出的数据保持一致,不然会出项一些你意想不到的问题 * 然后就是针对对象的读出 * * @param in */ protected Test(Parcel in) { name = in.readString(); test1 = in.readParcelable(Test1.class.getClassLoader());//对对象的读出 //对数组对象的读出 Parcelable[] pars = in.readParcelableArray(Test1.class.getClassLoader()); test1s = Arrays.asList(Arrays.asList(pars).toArray(new Test1[pars.length])); } public static final Creator<Test> CREATOR = new Creator<Test>() { @Override public Test createFromParcel(Parcel in) { return new Test(in); } @Override public Test[] newArray(int size) { return new Test[size]; } }; public String getName() { return name; } public void setName(String name) { this.name = name; } public Test1 getTest1() { return test1; } public void setTest1(Test1 test1) { this.test1 = test1; } public List<Test1> getTest1s() { return test1s; } public void setTest1s(List<Test1> test1s) { this.test1s = test1s; } @Override public int describeContents() { return 0; } /** * 将数据读出,要求写入的数据和读出的数据保持一致,不然会出项一些你意想不到的问题 * 然后就是针对对象的读出 */ @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(name); parcel.writeParcelable(test1, i); parcel.writeParcelableArray(test1s.toArray(new Test1[test1s.size()]), i); }}
3、对对象序列化的和对数组对象的序列化
test1 = in.readParcelable(Test1.class.getClassLoader());//对对象的读出//对数组对象的读出
Parcelable[] pars = in.readParcelableArray(Test1.class.getClassLoader());
test1s = Arrays.asList(Arrays.asList(pars).toArray(new Test1[pars.length]));
parcel.writeString(name);
parcel.writeParcelable(test1, i);
parcel.writeParcelableArray(test1s.toArray(new Test1[test1s.size()]), i);
4、对象序列化的和对数组对象的序列化错误往往会出现以下的错误:
android.os.BadParcelableException: ClassNotFoundException when unmarshalling:解决办法针对网上有很多人在对对象序列化时test1 = in.readParcelable(null);也可能出现这样的错误,所以原理理解好是快速编码的关键,然后就是认证的编码然后序列化的顺序要一致。
阅读全文
0 0
- Android系统中Parcelable和Serializable处理
- Android中 Parcelable和Serializable
- Android系统中Parcelable和Serializable的区别
- Android系统中Parcelable和Serializable的区别
- Android 系统中Parcelable和Serializable的区别
- Android系统中Parcelable和Serializable的区别
- Android系统中Parcelable和Serializable的区别
- Android系统中Parcelable和Serializable的区
- Android系统中Parcelable和Serializable的区别
- Android系统中Parcelable和Serializable的区别
- Android系统中Parcelable和Serializable的区别
- Android系统中Parcelable和Serializable的区别
- Android系统中Parcelable和Serializable的区别
- Android系统中Parcelable和Serializable的区别
- Android--系统中Parcelable和Serializable的区别
- Android系统中Parcelable和Serializable的区别
- android中Parcelable和Serializable的使用
- Android中Parcelable和Serializable的区别
- 20170527:初学java spring的困惑
- 我的博客
- 170527 逆向-CrackMe(4)
- 析构函数
- HDU5172-GTY's gay friends
- Android系统中Parcelable和Serializable处理
- 网页(H5/JS)游戏
- Spring_SSH整合之_架构的历史(架构整合JSP+Hibernate+Struts2)_5
- Highcharts 中文化显示
- bootstrap16---导航(标签页,胶囊,导航条)
- java多线程之CAS
- vslam学习笔记
- Ubuntu14.04安装谷歌浏览器
- 本地项目上传到自己的githug