android学习笔记3 - 序列化接口Parcelable、Serializable的使用与区别

两个接口的作用:

实现Parcelable就是为了进行序列化,android特有,高效

1.永久性保存对象,保存对象的字节序列到本地文件中;

2.通过序列化对象在网络中传递对象;

3.通过序列化在进程间传递对象。

同样,实现Serializable也是为了序列化,属于java特有,兼容性高:

1.可以提供一系列保存对象状态的方法网络发送;

2.文件储存对象状态;

3.管道发送对象给其他应用程序。

两者功能一致,对象,数组,线性表均可传输,但实现方式上有所区别。

Parcelable的实现

1.首先需要传输类实现这个接口,Parcel就是一个存放读取数据的容器,利用这个容器进行操作。Parcel机制:本质上把它当成一个Serialize就可以了。只是Parcel的对象实在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此更加高效。

2.重写public void writeToParcel(Parcel dest, int flags)方法,其中dest.write()方法用于写入数据,其中对象使用

方法dest.writeParcelable()进行传递,传递的对象必须实现Parcelable的接口。
3.在构造函数中增加顺序读取的方法,注意必须于写入程序相对应。

4.实例化静态内部对象CREATOR实现接口Parcelable.Creator

以下是整个类的定义:

package com.example.parcelableserializable;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.os.Parcel;
import android.os.Parcelable;
public class MyParcelable implements Parcelable
{
	private int integer1,integer2;  //注意这个序列顺序
	private String string;
	private DataB objectb=new DataB();
	private DataA objecta=new DataA();
	private List<DataA> arraylist=new ArrayList<DataA>();
	
	public MyParcelable()
	{
		
	}
	
	public MyParcelable(Parcel parcle)   //构造函数中进行数据读取,注意序列化
	{
		integer1=parcle.readInt();
		string=parcle.readString();
		integer2=parcle.readInt();
		
		ClassLoader loader1=DataB.class.getClassLoader(); 
		objectb=parcle.readParcelable(loader1);   //参数是类的加载器
		
		ClassLoader loader2=DataA.class.getClassLoader(); 
		objecta=(DataA) parcle.readValue(loader2);   //对象是object,需要进行类型强制转换
		
		//获取数组的值
		Parcelable[] myparcel=parcle.readParcelableArray(loader2);
		DataA[] a=new DataA[myparcel.length];
		List<Parcelable> par=Arrays.asList(myparcel);
		DataA[] dataa=par.toArray(a);
		arraylist=Arrays.asList(dataa);
		
		
	}
	
	@Override
	public int describeContents()  //内容描述,不用管
	{
		return 0;
	}

	@Override
	public void writeToParcel(Parcel dest, int flags)   //关键的数据传递,写入接口打包
	{
		dest.writeInt(integer1);
		dest.writeString(string);
		dest.writeInt(integer2);
		dest.writeParcelable(objectb, flags);
		dest.writeValue(objecta);
		DataA[] a=new DataA[arraylist.size()];   
		dest.writeParcelableArray(arraylist.toArray(a),flags);  //将按a类型对arraylist进行类型转换。
	} 
	
	//实例化静态内部对象CREATOR实现接口Parcelable.Creator
	
	public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() 
    {
        public MyParcelable createFromParcel(Parcel in) 
        {
            return new MyParcelable(in);
        }
        public MyParcelable[] newArray(int size) 
        {
            return new MyParcelable[size];
        }
    };
    
    
    
    public void setinteger1(int inta)
    {
    	integer1=inta;
    }
    
    public int getinteger1()
    {
    	return integer1;
    }
    
    public void setinteger2(int inta)
    {
    	integer2=inta;
    }
    
    public int getinteger2()
    {
    	return integer2;
    }
    
    public void setString(String stringa)
    {
    	string=stringa;
    }
    
    public String getstring()
    {
    	return string;
    }
    
    public void setDataA(DataA data)
    {
    	objecta=data;
    }
    
    public DataA getDataA()
    {
    	return objecta;
    }

    public void setDataB(DataB data)
    {
    	objectb=data;
    }
    
    public DataB getDataB()
    {
    	return objectb;
    }
    
    public void setarraylist(List array)
    {
    	arraylist=array;
    }
    
    public List getarraylist()
    {
    	return arraylist;
    }
}

MainActivity调用方法:

private MyParcelable mypar=new MyParcelable();
Intent intent=new Intent();
intent.setClass(this,TestActivity01.class);
intent.putExtra("mypar",mypar);
在TestActivity01中调用获取:

mypar=(MyParcelable) this.getIntent().getExtras().get("mypar");

Serializable的实现:

这只是给对象打了一个标记,系统会自动将其序列化,作用是将数据对象存入字节流当中,在需要时重新生成对象

import java.io.Serializable;

public class MySerializable implements Serializable  
{
	private static final long serialVersionUID = 1L;    //序列id
	private int data;
	private String string;
	
	public MySerializable()
	{
		
	}
	
	
	public void setdata(int data)
	{
		this.data=data;
	}
	
	public int getdata()
	{
		return data;
	}
	
	public void setstring(String string)
	{
		this.string=string;
	}
	
	public String getstring()
	{
		return string;
	}
}

调用方式与Parcelable基本一致:

private MySerializable myser=new MySerializable();
Intent intent=new Intent();
intent.setClass(this,TestActivity01.class);
intent.putExtra("myser",myser);

TestActivity01中调用

myser=(MySerializable) this.getIntent().getExtras().get("myser");













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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值