Android使用序列化接口Parcelable、Serializable

在Android开发过程中,经常要在Activity之间传递参数,使用Android系统提供的方法可以传递基本数据类型的变量,但有时候我们经常要传递一些复杂的数据类型或自定义的类,这种情况的参数无法直接传递,我们可以通过序列化实现。


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

自定义类MyClass、MyClassA、MyClassB

MyClassA:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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:

?
1
2
3
4
5
6
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:

?
1
2
MyClass myClass = (MyClass)getIntent().getParcelableExtra( "key" );
Log.d( "ParcelableActivity" , myClass.a);


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

自定义类MyClass、MyClassA、MyClassB

MyClassA:

?
1
2
3
4
5
6
7
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实现方法同上。

?
1
2
3
4
5
6
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);
?
1
2
MyClass myClass = (MyClass)getIntent().getSerializableExtra( "key" );
Log.d( "SerializableActivity" , myClass.a);

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值