还记得在早期写android的时候不知道怎么传递对象,用的是静态引用来处理。。。都是泪,今天突然又看回到序列化的知识然后又想起一个插件,想要推荐给大家的,就有了这篇文章,写下来记录一下,基本上都是联想起来什么就写什么,没有上网cv什么内容,所以不会很长,具体概念什么的自行google吧。


其实在我们网络传输或者本地持久化的时候,和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 CREATOR = new Parcelable.Creator() {        @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 CREATOR = new Parcelable.Creator() {        @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平台下推荐使用用于内存序列化。


更多相关文章

  1. [置顶] 蓝牙防丢器原理、实现与Android(安卓)BLE接口编程
  2. [置顶] AIDL旅行记之AIDL的简单使用
  3. Android修炼之检测非SDK接口
  4. Android事件分发机制-自己理解以后的阐述
  5. Android(安卓)应用热修复与插件化简介
  6. Android(安卓)R新特性:非SDK接口限制的更新
  7. Android(安卓)4.4 Kitkat 音频实现及简要分析
  8. [Android(安卓)插件化(一)] DynamicLoadApk的用法
  9. 初识Android(安卓)MVP模式

随机推荐

  1. Android(安卓)- BroadcastReceiver
  2. Android学习笔记---第二天---基础UI组件-
  3. Android Support Library
  4. Android 操作SQLite数据库(初步)-在程序中
  5. Android跨进程通信——Activity
  6. Android BackgroundViewPager:类似桌面背
  7. android -------- LiveDataBus的使用
  8. Android Q(10) SystemUI添加快速设置按钮
  9. Android RIL结构分析与移植
  10. (翻译) Backward Compatibility for Appl