序列化之serializable和parcelable的区别

一.serializable

用改方式实现序列化很简单,直接实现该接口就行了,其他的工作都被系统完成了。

public class Student implements Serializable {
    private static  final long servialVersionUID=5432164564132123L;
    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;
    }
}

注意“”servialVersionUID 原则上序列化后的数据中的serialVersionUID只有和当前类的serialVersionUID相同才能够正常的被反序列化。如果不一致,说明当前类和序列化的类相比发生一些变化(变量,变量类型等等),则会报错。

parcelable 方法

采用该方法需要实现该接口并且手动实现序列化过程,相对复杂点。具体方式如下

public class User implements Parcelable {
    String name;
    int age;

    protected User(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }
    //该方法用来反序列化
    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
    /**
     * 内容描述  几乎都是0,只有当前对象存在文件描述符的时候返回1。
     */
    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 将对象写入序列化的结构中
     * @param dest  用来操作序列化的 Parcel类
     * @param flags   有两种值,为1是表嗾使当前对象需要作为返回值返回,不能立即释放资源,几乎都是0
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }
}

两者区别

serializable 是java的序列化接口。特点是简单,但是对于内存开销大,序列化和反序列化需要很多的I/O流操作。
parcelable 是安卓的序列化方式,听名字就知道更适合,主要用于在内存序列化上,
如果序列化到存储设备(文件等)或者网络传输,比较复杂,建议用serrialzable方式。

参考:《安卓开发艺术探索》
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容