Android序列化和反序列化

原创 2016年07月10日 14:36:49

序列化和反序列化是什么

1.序列化是将对象持久化保存的一种方式。它会将数据转化为字节序列。
2.反序列化是将字节序列还原为数据

为什么要序列化

前面说到序列化是将数据转化为字节序列,对于字节序列有如下好处。
1.便于存储,将序列写入输出数据流中,存储到文件中
2.便于传输,字节序列可以直接用于网络传输,进程间传递对象,将可序列化对象放入Intent或Bundle中,在组建中进行传递

实现方式

两种实现方式Serializable和Parcelable.
这里需要讲解一些注意点:
1.static关键字,拥有static关键字的属性不会自动序列化,除非你writeInt,writeString等将其写出
2.transient关键字,修饰的字段属性不会被序列化,此关键字只对属性有效
3.serialVersionUID关键字,将class与serialVersionUID相联系,用于在反序列化的时候验证序列化时使用的类和加载时是否使用的是一个类,否则抛出InvalidClassException

Serializable

特点:
1.是一种标识接口(marker interface),Class直接实现Serialization接口即可.
2.利用了反射机制,序列化非常慢。

public class SerializationClass implements Serializable{
    String name;
    int age;
}

Parcelable

官网
特点:
1. 不利用反射,直接显式将字段写出,速度快效率高
2. Parcelable的数据传输依靠parcel实现,不适合进行持久化存储。

Parcelable接口会实现3个函数,和一个CREATOR(假定定义类ParcelableClass实现了Parcelable接口)
1. protected ParcelableClass(Parcel in) :将数据从parcel读入到对象中
2. public static final Creator CREATOR:构造器,两个方法,一个创建一个对象,另一个创建一个对象数组
3. public int describeContents():描述Parcelable实例的排列形式,一般会返回0
4. public void writeToParcel(Parcel dest, int flags):将数据写入parcel对象,以什么样的顺序写入就会以什么样的顺序读出。

public class ParcelableClass implements Parcelable{
    String name;
    int age;
    Grade grade;

    public ParcelableClass(String name,int age,Grade grade){
        this.name = name;
        this.age = age;
        this.grade = grade;
    }

    protected ParcelableClass(Parcel in) {
        this.name = in.readString();
        this.age = in.readInt();
        //this.grade = in.readTypedObject(Grade.CREATOR);//API23之后可用
        this.grade = (Grade)in.readValue(Grade.class.getClassLoader());
    }

    public static final Creator<ParcelableClass> CREATOR = new Creator<ParcelableClass>() {
        @Override
        public ParcelableClass createFromParcel(Parcel in) {
            return new ParcelableClass(in);
        }

        @Override
        public ParcelableClass[] newArray(int size) {
            return new ParcelableClass[size];
        }
    };

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        dest.writeValue(grade);
    }

    public static class Grade implements Parcelable{
        String course;
        int grade;

        public Grade(String course,int grade){
            this.course = course;
            this.grade = grade;
        }
        protected Grade(Parcel in) {
            this.course = in.readString();
            this.grade = in.readInt();
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(course);
            dest.writeInt(grade);
        }

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

        public static final Creator<Grade> CREATOR = new Creator<Grade>() {
            @Override
            public Grade createFromParcel(Parcel in) {
                return new Grade(in);
            }

            @Override
            public Grade[] newArray(int size) {
                return new Grade[size];
            }
        };
    }
    get(),set()函数。
}

Activity之间传递:
FirstActivity

        ParcelableClass.Grade grade = new ParcelableClass.Grade("math", 100);
        ParcelableClass parcelableClass = new ParcelableClass("chenfeng", 21,grade);
        Log.e(TAG, "序列化前");
        Log.e(TAG, "name:" + parcelableClass.getName());
        Log.e(TAG, "age:" + parcelableClass.getAge());
        Log.e(TAG, "Grade-course:" + parcelableClass.getGrade().getCourse());
        Log.e(TAG, "Grade-grade:" + parcelableClass.getGrade().getGrade());
        Bundle bd = new Bundle();
        bd.putParcelable("pd",parcelableClass);
        Intent intent = new Intent();
        intent.putExtra("bd",bd);
        intent.setClass(MainActivity.this,SecondActivity.class);
        startActivity(intent);

SecondActivity

        Bundle bd = getIntent().getBundleExtra("bd");
        if(bd == null) Log.e(TAG, "onCreate: bd == null");
        ParcelableClass parcelableClass1 = bd.getParcelable("pd");
        Log.e(TAG, "序列化后");
        Log.e(TAG, "name:" + parcelableClass1.getName());
        Log.e(TAG, "age:" + parcelableClass1.getAge());
        Log.e(TAG, "Grade-course:" + parcelableClass1.getGrade().getCourse());
        Log.e(TAG, "Grade-grade:" + parcelableClass1.getGrade().getGrade());
    }

结果

参考链接:
android-parcelable-serializable,transient,serizlizationUID

不足之处请指教!
转载请注明出处@author chenfeng

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android Parcelable 嵌套readParcelable

对于Android的自定义对象进行序列化,一般会选择Parcelable,或者Serializable。 在Android中,由于在使用内存时,Parcelable类要比Serializable类的...
  • wangbole
  • wangbole
  • 2015年01月07日 15:52
  • 7698

Android的序列化和反序列化

之前参加某外企公司的面试,面试官让我写一个序列化和反序列化的代码,写的不对,痛心疾首,回来好好学习! 本文转自:http://www.cnblogs.com/xdp-gacl/p/3777987.h...
  • yearningseeker
  • yearningseeker
  • 2016年07月21日 13:48
  • 217

初识Android序列化与反序列化

最近在学习Rxjava相关的内容,从github上clone别人写项目来学习,发现Parcelable这个接口,google了一下,发现这个东西还挺重要的,于是决定巴拉巴拉,加深一下自己的认识1.什么...
  • Gpwner
  • Gpwner
  • 2016年10月29日 22:05
  • 1329

Android序列化与反序列化

1. 什么是java序列化,如何实现java序列化?我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计...
  • axi295309066
  • axi295309066
  • 2016年10月26日 21:23
  • 1897

序列化和反序列化的简单理解

一、序列化和反序列化的概念   把对象转换为字节序列的过程称为对象的序列化。   把字节序列恢复为对象的过程称为对象的反序列化。   对象的序列化主要有两种用途:   1) 把对象的字节序列永久地保...
  • abc6368765
  • abc6368765
  • 2016年05月10日 19:24
  • 34759

Android中两种序列化方式的比较Serializable和Parcelable

Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用者两种序列化方式。还有,我们需要对象持久化到存储设备或者通过网络...
  • wangchunlei123
  • wangchunlei123
  • 2016年05月08日 13:33
  • 10854

对序列化和反序列化的理解

楼主的问题很有意思,不过你对序列化和反序列的应用场景搞错了,我们说的序列化和反序列化是对JAVA而言(其他面向对象语言可能也有)的,序列化的实体是个对象,结果也是个对象,并非是格式化文本,你在记事本里...
  • l354002675
  • l354002675
  • 2017年03月17日 14:35
  • 1453

Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 什么叫序列化和反序列化 为啥要实现这个 Serializable 接口,也就是为啥要序列化 serialVersi...
  • qq_27093465
  • qq_27093465
  • 2017年11月28日 18:40
  • 948

Android中XML文件的序列化和解析

Android中XML文件的序列化和解析一、XML文件的序列化说白了,序列化就是就是将数据存储起来,又叫持久化。XML的序列化就是将对象类型的数据将他们保存在XML文件中。下面我们来说说XML序列化的...
  • chenlxhf
  • chenlxhf
  • 2016年07月12日 23:41
  • 1345

序列化反序列化性能对比

序列化:      我们通常把序列化称为编码(Ecode),它将对象序列化为字节数组,用于网络传输,数据持久化或者其他用途。 反序列化:     反序列化称之为解码(Decode),需要使用特定的序列...
  • Steven_Li_58
  • Steven_Li_58
  • 2016年07月21日 12:57
  • 518
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android序列化和反序列化
举报原因:
原因补充:

(最多只允许输入30个字)