[Android] Android使用序列化接口Parcelable、Serializable

原创 2016年06月01日 23:34:20

   在Android开发过程中,经常要在Activity之间传递参数,使

用Android系统提供的方法可以传递基本数据类型的变量,但有时

候我们经常要传递一些复杂的数据类型或自定义的类,这种情况

的参数无法直接传递,我们可以通过序列化实现。


1、使用Pacelable接口,重写Parcelable接口中的两个方法和静

态变量CREATOR

自定义类MyClass、MyClassA、MyClassB

MyClassA:

public class MyClass implements android.os.Parcelable {
    private String a = null;
    private int b = 0;
    private MyClassA myClassA = new MyClassA;
    private List<MyClassB> myClassB = new ArrayList<MyClassB>();
    public MyClass(Parcel parcel) {
        // 按变量定义的顺序读取
        a = parcel.readString();
        b = parcel.readInt();
        myClassA = parcel.readParcelable(MyClassA.class.getClassLoader());
        Parcelable[] pars = parcel.readParcelableArray(MyClassB.class.getClassLoader());
        myClassB = Arrays.asList(Arrays.asList(pars).toArray(new MyClassB[pars.length]));
    }
    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // 按变量定义的顺序写入
        dest.writeString(a);
        dest.writeString(b);
        dest.writeParcelable(myClassA, flags);
        dest.writeParcelableArray((myClassB.toArray(new MyClassB[myClassB.size()])), flags);
    }
    public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>() {
        @Override
        public Param createFromParcel(Parcel source) {
            return new MyClass(source);
        }
        @Override
        public MyClass[] newArray(int size) {
            return new MyClass[size];
        }
    };
}

MyClassA、MyClassB实现方法同上。

TestActivity.java:

MyClass myClass = new MyClass("a""b"new MyClassA(), new ArrayList<MyClassB>());
Intent intent = new Intent(this, ParcelableActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("key"myClass);
intent.putExtras(bundle);
startActivity(intent);

ParcelableActivity.java:

MyClass myClass = (MyClass)getIntent().getParcelableExtra("key");
Log.d("ParcelableActivity"myClass.a);


2、使用Serializable接口,定义序列化ID

自定义类MyClass、MyClassA、MyClassB

MyClassA:

public class MyClass implements java.io.Serializable {
    private static final long serialVersionUID = 1L; // 定义序列化ID
    private String a = null;
    private int b = 0;
    private MyClassA myClassA = new MyClassA;
    private List<MyClassB> myClassB = new ArrayList<MyClassB>();
}

MyClassA、MyClassB实现方法同上。

MyClass myClass = new MyClass("a""b"new MyClassA(), new ArrayList<MyClassB>());
Intent intent = new Intent(this, SerializableActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("key"myClass);
intent.putExtras(bundle);
startActivity(intent);
MyClass myClass = (MyClass)getIntent().getSerializableExtra("key");
Log.d("SerializableActivity"myClass.a);

相比之下,使用Parcelable接口更高效,但是需要实现部分方法,使用Serializable接口更方便,只需要定义一个序列化ID,但是效率比较低。

另外,Parcelable接口为Android特有的,Serializable接口是jre普遍所有的,兼容性更好一点。

至于使用哪种方法,并没有一定的成规可循,要根据实际情况而定。

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

Android中使用Serializable和Parcelable实现序列化详解(含实例)

Android中实现序列化有两种方式,一种是使用Serializable另一种就是Parcelable了。 Serializable本身就是JavaSE支持的,Parcelable是Android特...
  • L664675249
  • L664675249
  • 2015年10月25日 14:12
  • 6621

Android使用序列化接口Parcelable、Serializable

serializable: Parcelable: public class ListInfo implements Parcelable { String name; Strin...
  • qq_30716173
  • qq_30716173
  • 2015年12月27日 22:35
  • 1292

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

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

Android Intent传递Parcelable和Serializable对象原理分析

Android Intent传递Parcelable和Serializable对象原理分析  当我们需要打开一个Activity的时候,经常使用Intent去传递一些数据给将要打开的Activity。...
  • u012341052
  • u012341052
  • 2017年03月30日 11:40
  • 699

Android开发中两种序列化Serializable 和 Parcelable

什么是序列化 我们总是说着或者听说着“序列化”,它的定义是什么呢? 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状...
  • cishaohui
  • cishaohui
  • 2017年05月18日 10:27
  • 300

序列化与反序列化之Parcelable和Serializable浅析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52665164 出自【zejian的博客】 本篇小...
  • javazejian
  • javazejian
  • 2016年09月26日 15:50
  • 8540

Android进阶 - 1 - Parcelable和Serializable使用详解

如果我们需要通过Intent和Binder传输数据时就需要使用Parcelable或者Serializable对对象序列化。甚至有时候在把持久化的对象保存在存储设备上或者通过网络传输给其他客户端的时候...
  • IO_Field
  • IO_Field
  • 2016年05月26日 23:34
  • 3348

Android 进阶6:两种序列化方式 Serializable 和 Parcelable

什么是序列化我们总是说着或者听说着“序列化”,它的定义是什么呢? 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或...
  • u011240877
  • u011240877
  • 2017年05月17日 23:57
  • 3373

Android使用Parcelable序列化复杂数据结构

前言说到序列化我们都不陌生,最简单的就是让我们的实体类来实现java io包下的Serializable接口即可,但是android单独又写了自己的序列化方案,即Parcelable,它比Serial...
  • aiynmimi
  • aiynmimi
  • 2017年03月23日 16:15
  • 1219

Android Serializable与Parcelable原理与区别

一、序列化、反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。 对象的反序列化:把字节序列恢复为Java对象的过程。 (2) 序列化详细解释...
  • love_world_
  • love_world_
  • 2014年03月26日 07:25
  • 4566
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Android] Android使用序列化接口Parcelable、Serializable
举报原因:
原因补充:

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