前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android中的序列化:Parcelable和Serializable

Android中的序列化:Parcelable和Serializable

作者头像
用户1205080
发布2018-12-21 11:52:35
6970
发布2018-12-21 11:52:35
举报
文章被收录于专栏:编码前线编码前线编码前线

概述

序列化:将一个对象转换成 可存储可传输的状态。

Parcelable和Serializable的区别

作用

Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。 Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

性能比较
  • 在内存的使用中,Parcelable的性能方面要强于Serializable;
  • Serializable序列化操作的时候会产生大量的临时变量(原因是使用了反射机制),从而导致GC的频繁调用,因而性能比Parcelable差;
  • Parcelable是以IBinder作为信息载体的。在内存上的开销比较小,因此内存直接进行数据传递的时候,Android推荐使用Parcelable;
  • 在读写数据的时候,Parcelable是在内存中直接进行读写,而Serializable是通过IO流的形式将数据写入到硬盘上。
选择

Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如Activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为Android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。

Serializable的使用

对于Serializable的使用,类只需要实现Serializable接口。

public class User implements Serializable {

    /**
     * Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。
     * 在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,
     * 如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。
     * (如果没有显示定义,Java序列化机制会根据编译的Class自动生成一个serialVersionUID做为序列化版本比较用,如果Class文件没有发生变化,则serialVersionUID不变)
     */
    private static final long serialVersionUID = 123456789L;

    private String uid;
    private String userName;
    private int age;
}

Parcelable的使用

Parcelable的使用,需要实现 writeToParceldescribeContents函数以及静态的 CREATOR变量。

public class User implements Parcelable {
    private String uid;
    private String userName;
    private int age;

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.uid);
        dest.writeString(this.userName);
        dest.writeInt(this.age);
    }

    public User() {
    }

    protected User(Parcel in) {
        this.uid = in.readString();
        this.userName = in.readString();
        this.age = in.readInt();
    }

    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];
        }
    };
}

参考链接

  1. https://blog.csdn.net/ljx19900116/article/details/41699593
  2. https://greenrobot.me/devpost/android-parcelable-serializable/
  3. https://www.jianshu.com/p/a60b609ec7e7
  4. https://www.cnblogs.com/yezhennan/p/5527506.html
  5. https://developer.android.com/reference/java/io/Serializable
  6. https://developer.android.com/reference/android/os/Parcelable
  7. https://www.cnblogs.com/duanxz/p/3511695.html
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编码前线 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • Parcelable和Serializable的区别
    • 作用
      • 性能比较
        • 选择
        • Serializable的使用
        • Parcelable的使用
        • 参考链接
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档