Android中序列化的Parcelable与Serializable区别及其AS插件
2016-07-29 15:30
357 查看
还记得在早期写android的时候不知道怎么传递对象,用的是静态引用来处理。。。都是泪,今天突然又看回到序列化的知识然后又想起一个插件,想要推荐给大家的,就有了这篇文章,写下来记录一下,基本上都是联想起来什么就写什么,没有上网cv什么内容,所以不会很长,具体概念什么的自行google吧。
其实在我们网络传输或者本地持久化的时候,和intent传递对象时,都是需要将对象序列化的。
Serializable是java的序列化接口
Parcelable是android提供的序列化接口
不用想都知道它们肯定有区别,不然谁没事给你弄两个一样的东西。
因为写的android就用intent传值来做栗子
一.Serializable一般实现
intent传递user时
获取
这样就完成了intent的传值,so easy
有一个地方需要注意一下,就是那个serialVersionUID,当序列化后的数据的serialVersionUID与类的serialVersionUID一致时,才会正常被反序列化,因为序列化的时候serialVersionUID也是会被写进去的,反序列就会与类的serialVersionUID进行对比。
最好是手动指定一个值,如果有IDE来生成一个hash那么当类改变了加了一个属性,就会生成另外一个hash值,那么原来的数据反序列化就会失败
2.Parcelable一般实现
intent传递user时跟上面是一样的
获取
看完这次的User类,可能就有人开始骂了,代码多了很多啊,还要重新方法,这样很麻烦啊,那么下面直接推荐一个AS的插件,还在用eclipse的童鞋羡慕吧,现在github上面七八成库都是AS的项目了,如果是新项目建议还是换到AS来,做的是老项目那就没办法了。
三.Parcelable的AS插件
神器android parcelable code generator
在AS的设置里找到插件,搜索就可以安装了,这个插件已经有很多颗星了,装完需要重启。
然后,找到你自己的User
按alt+Insert,选Parcelable,然后就自动生成一堆代码,该重写的都自动写好了,so cool。
最后来看下Serializable与Parcelable的区别
Serializable:java序列化接口,使用简单,但是开销大,序列化和反序列化都会进行大量IO。
Parcelable:Android平台的序列化,使用麻烦点,效率高,Android平台下推荐使用用于内存序列化。
其实在我们网络传输或者本地持久化的时候,和intent传递对象时,都是需要将对象序列化的。
Serializable是java的序列化接口
Parcelable是android提供的序列化接口
不用想都知道它们肯定有区别,不然谁没事给你弄两个一样的东西。
因为写的android就用intent传值来做栗子
一.Serializable一般实现
public class User implements Serializable { private static final long serialVersionUID = 10001L; private int userID; private String userName; public int getUserID() { return userID; } public void setUserID(int userID) { this.userID = userID; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
intent传递user时
User user = new User(); user.setUserID(10086); user.setUserName("roman"); Intent intent = new Intent(this, Main2Activity.class); intent.putExtra("user", user); startActivity(intent);
获取
User user = (User) getIntent().getSerializableExtra("user");
这样就完成了intent的传值,so easy
有一个地方需要注意一下,就是那个serialVersionUID,当序列化后的数据的serialVersionUID与类的serialVersionUID一致时,才会正常被反序列化,因为序列化的时候serialVersionUID也是会被写进去的,反序列就会与类的serialVersionUID进行对比。
最好是手动指定一个值,如果有IDE来生成一个hash那么当类改变了加了一个属性,就会生成另外一个hash值,那么原来的数据反序列化就会失败
2.Parcelable一般实现
public class User implements Parcelable { private int userID; private String userName; public int getUserID() { return userID; } public void setUserID(int userID) { this.userID = userID; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.userID); dest.writeString(this.userName); } public User() { } protected User(Parcel in) { this.userID = in.readInt(); this.userName = in.readString(); } public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { @Override public User createFromParcel(Parcel source) { return new User(source); } @Override public User[] newArray(int size) { return new User[size]; } };
intent传递user时跟上面是一样的
User user = new User(); user.setUserID(10086); user.setUserName("roman"); Intent intent = new Intent(this, Main2Activity.class); intent.putExtra("user", user); startActivity(intent);
获取
User user = getIntent().getParcelableExtra("user");
看完这次的User类,可能就有人开始骂了,代码多了很多啊,还要重新方法,这样很麻烦啊,那么下面直接推荐一个AS的插件,还在用eclipse的童鞋羡慕吧,现在github上面七八成库都是AS的项目了,如果是新项目建议还是换到AS来,做的是老项目那就没办法了。
三.Parcelable的AS插件
神器android parcelable code generator
在AS的设置里找到插件,搜索就可以安装了,这个插件已经有很多颗星了,装完需要重启。
然后,找到你自己的User
public class User { private int userID; private String userName; }
按alt+Insert,选Parcelable,然后就自动生成一堆代码,该重写的都自动写好了,so cool。
public class User implements Parcelable { private int userID; private String userName; public int getUserID() { return userID; } public void setUserID(int userID) { this.userID = userID; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.userID); dest.writeString(this.userName); } public User() { } protected User(Parcel in) { this.userID = in.readInt(); this.userName = in.readString(); } public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { @Override public User createFromParcel(Parcel source) { return new User(source); } @Override public User[] newArray(int size) { return new User[size]; } };
最后来看下Serializable与Parcelable的区别
Serializable:java序列化接口,使用简单,但是开销大,序列化和反序列化都会进行大量IO。
Parcelable:Android平台的序列化,使用麻烦点,效率高,Android平台下推荐使用用于内存序列化。
相关文章推荐
- 修改Android MTK 开关机动画 log
- Android三种播放视频的方式
- Android Studio代码自动提示无效
- Android自定义控件之基本原理(一)
- Android selector
- 解析 IllegalStateException--"Fragment already active"
- android adb源码分析(3)
- Android自定义控件之自定义属性(二)
- 彻底解决Android GPS没法定位这一顽固问题
- Android通知
- 深入理解Android之Gradle
- Android自定义控件之自定义组合控件(三)
- Android--延迟页面跳转实现方法
- Android GPS应用开发
- android桌面动画
- Android ScaleDrawable
- Android ScaleDrawable
- android 内存泄漏问题
- android中ExpandableListView嵌套GridView使用
- android:foreground