美文网首页Android开发Android开发经验谈Android开发
Serializable 和 Parcelable 的使用和区别

Serializable 和 Parcelable 的使用和区别

作者: Android开发架构 | 来源:发表于2019-06-03 21:40 被阅读24次

    1、 序列化的目的

    (1)永久的保存对象,将对象数据保存在文件、磁盘或者数据库中 。

    (2)通过序列化操作将对象数据在网络上进行传输 。

    (3)将对象序列化之后在进程间进行传输 。

    (4)在安卓中使用 Intent 进行传输时候,数据类型较为复杂的需要进行序列化操作 。

    2、 Serializable

    public class Mybox4 implements Serializable {
        private String name;
        private String age;
    
        public Mybox4(String name, String age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Mybox4{" +
                    "name='" + name + '\'' +
                    ", age='" + age + '\'' +
                    '}';
        }
    }
    
    

    通过上述代码可以看出,使用 Serializable 的时候比较简单,只需要实现 Serializable 接口即可,这样就告诉程序这个类是可以被序列化的。

    下面看下如何实现对象的序列化与反序列化:

    Mybox4 mybox4 = new Mybox4("keven", "27");
    File file = new File("box.out");
    
    //序列化
    FileOutputStream outputStream = new FileOutputStream(file);
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
    objectOutputStream.writeObject(mybox4);
    objectOutputStream.close();
    
    //反序列化
    FileInputStream fileInputStream = new FileInputStream(file);
    ObjectInputStream inputStream = new ObjectInputStream(fileInputStream);
    Mybox4 o = (Mybox4) inputStream.readObject();
    inputStream.close();
    System.out.println(o.toString());
    

    输出为:

    Mybox4{name='keven', age='27'}
    

    3、 Parcelbale

    Parcelable 是 Android 特有的序列化方式,他的实现相对 Serialiable 来说更加复杂一点。

    Parcelable 内部包装了可序列化的数据,序列化功能由 writeToParcel 方法完成,反序列化由 CREATOR 完成。

    public class Mybox4Par implements Parcelable {
        private String name;
        private String age;
    
        public Mybox4Par(String name, String age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Mybox4Par{" +
                    "name='" + name + '\'' +
                    ", age='" + age + '\'' +
                    '}';
        }
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeString(age);
        }
    
        public static final Parcelable.Creator<Mybox4Par> CREATOR=new Creator<Mybox4Par>() {
            @Override
            public Mybox4Par createFromParcel(Parcel source) {
                return new Mybox4Par(source);
            }
    
            @Override
            public Mybox4Par[] newArray(int size) {
                return new Mybox4Par[size];
            }
        };
    
    
        public Mybox4Par(Parcel in){
            name=in.readString();
            age=in.readString();
        }
    }
    

    上述就是实现了 Parcelable 接口,并重写方法,我们看下如何使用:

    //第一个Activity
    
    Mybox4Par mybox4Par=new Mybox4Par("keven","25");
    Bundle bundle=new Bundle();
    Intent intent=new Intent(this,MyViewActivity.class);
    bundle.putParcelable("box",mybox4Par);
    intent.putExtras(bundle);
    startActivity(intent);
    //第二个Activity
    
    Intent intent=getIntent();
    Bundle extras = intent.getExtras();
    Mybox4Par box = extras.getParcelable("box");
    Log.e("box",box.toString());
    

    4、 两者选择

    Serializable 使用简单但是开销很大,序列化与反序列化需要大量的 I/O 操作,一般用于将对象序列化到存储设备中,或序列化后通过网络传输;

    Parcelable 使用稍微麻烦点,但是效率高,主要用在内存序列化上。

    更多资料分享欢迎Android工程师朋友们加入安卓开发技术进阶互助:856328774免费提供安卓开发架构的资料(包括Fultter、高级UI、性能优化、架构师课程、 NDK、Kotlin、混合式开发(ReactNative+Weex)和一线互联网公司关于Android面试的题目汇总。

    相关文章

      网友评论

        本文标题:Serializable 和 Parcelable 的使用和区别

        本文链接:https://www.haomeiwen.com/subject/gwwhxctx.html