• Android中的Parcelable接口和Serializable使用方法和差别


    Parcelable接口:

    Interface for classes whose instances can be written to and restored from a Parcel。 Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator interface

    类的实例能被写到和被存储到一个包裹里的接口。实现Parcelable 接口的类也必须有一个静态变量CREATOR,这个静态变量是一个实现 Parcelable.Creator接口的对象

    序列化的原因和优点:

    1,通过序列化对象在网络中传递对象;,
    2。通过序列化在进程间传递对象。

    实现序列化的两种方法:

    一是实现Serializable接口(是JavaSE本身就支持的),一是实现Parcelable接口(是Android特有功能。效率比实现Serializable接口高效。可用于Intent数据传递,也能够用于进程间通信(IPC))。

    实现Serializable接口很easy,声明一下就能够了,而实现Parcelable接口略微复杂一些,但效率更高,推荐用这样的方法提高性能



    注:Android中Intent传递对象有两种方法:一是Bundle.putSerializable(Key,Object),还有一种是Bundle.putParcelable(Key。Object)。当然这些Object是有一定的条件的。前者是实现了Serializable接口,而后者是实现了Parcelable接口。

    Parcelable接口的定义:

    public interface Parcelable 
    {
        //内容描写叙述接口,基本不用管
        public int describeContents();
        //写入接口函数,打包
        public void writeToParcel(Parcel dest, int flags);
        //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。由于实现类在这里还是不可知的,所以须要用到模板的方式,继承类名通过模板參数传入
        //为了可以实现模板參数的传入。这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例
        public interface Creator<T> 
        {
               public T createFromParcel(Parcel source);
               public T[] newArray(int size);
        }
    }

    实现Parcelable步骤:

    1)implements Parcelable
    2)重写writeToParcel方法。将你的对象序列化为一个Parcel对象。即:将类的数据写入外部提供的Parcel中,打包须要传递的数据到Parcel容器保存,以便从 Parcel容器获取数据
    3)重写describeContents方法。内容接口描写叙述,默认返回0就能够
    4)实例化静态内部对象CREATOR实现接口Parcelable.Creator

    public static final Parcelable.Creator<T> CREATOR
    实现Parcelable内部接口Creator的对象,必须实现两个方法:

    注:当中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须所有大写。需重写本接口中的两个方法:createFromParcel(Parcel in) 实现从Parcel容器中读取传递数据值。封装成Parcelable对象返回逻辑层,newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话就可以(return new T[size])。供外部类反序列化本类数组使用。

    总之:通过writeToParcel将你的对象映射成Parcel对象。再通过createFromParcel将Parcel对象映射成你的对象。

    也能够将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,仅仅只是这个过程须要你来实现。因此写的顺序和读的顺序必须一致。

    代码:

    1,实现Parcelable接口

    package com.hust.bean;
    
    import android.graphics.Bitmap;
    import android.os.Parcel;
    import android.os.Parcelable;
    
    public class Book implements Parcelable {//实现Parcelable接口
    	/*
    	 * book属性
    	 * */
    	private  String Title="";		//标题
    	private  Bitmap Cover;			//封面
    	private  String Author="";		//作者
    	private  String Publisher="";	//出版社
    	private  String PublishDate="";//出版日期
    	private  String ISBN="";		//ISBN
    	private  String Summary="";		//简单介绍
    	@Override
    	public int describeContents() {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    	//写到parcel中
    	@Override
    	public void writeToParcel(Parcel dest, int flags) {
    		// TODO Auto-generated method stub
    		dest.writeString(Title);
    		dest.writeParcelable(Cover, flags);
    		dest.writeString(Author);
    		dest.writeString(Publisher);
    		dest.writeString(PublishDate);
    		dest.writeString(ISBN);
    		dest.writeString(Summary);
                
    	}
    	//必须实例化Parcelable的内部接口Creator,一个字都不能变
    	public static final Parcelable.Creator<Book> CREATOR=new Creator<Book>(){
            //从Pacel容器中读出来
    		@Override
    		public Book createFromParcel(Parcel source) {
    			// TODO Auto-generated method stub
    			Book book=new Book();
    			book.Title=source.readString();
    			book.Cover=source.readParcelable(Bitmap.class.getClassLoader());
    			book.Author=source.readString();
    			book.Publisher=source.readString();
    			book.PublishDate=source.readString();
    			book.ISBN=source.readString();
    			book.Summary=source.readString();			
    			return book;
    		}
    
    		@Override
    		public Book[] newArray(int size) {
    			// TODO Auto-generated method stub
    			return new Book[size];
    		}
    		
    	};
    	public String getTitle() {
    		return Title;
    	}
    
    	public void setTitle(String title) {
    		Title = title;
    	}
    
    	public Bitmap getCover() {
    		return Cover;
    	}
    
    	public void setCover(Bitmap cover) {
    		Cover = cover;
    	}
    
    	public String getAuthor() {
    		return Author;
    	}
    
    	public void setAuthor(String author) {
    		Author = author;
    	}
    
    	public String getPublisher() {
    		return Publisher;
    	}
    
    	public void setPublisher(String publisher) {
    		Publisher = publisher;
    	}
    
    	public String getPublishDate() {
    		return PublishDate;
    	}
    
    	public void setPublishDate(String publishDate) {
    		PublishDate = publishDate;
    	}
    
    	public String getISBN() {
    		return ISBN;
    	}
    
    	public void setISBN(String iSBN) {
    		ISBN = iSBN;
    	}
    
    	public String getSummary() {
    		return Summary;
    	}
    
    	public void setSummary(String summary) {
    		Summary = summary;
    	}
    	
    	
    
    }
    


    2。实现Serializable接口

    public class Person implements Serializable
    {
        private static final long serialVersionUID = -7060210544600464481L;
        private String name;
        private int age;
        
        public String getName()
        {
            return name;
        }
        
        public void setName(String name)
        {
            this.name = name;
        }
        
        public int getAge()
        {
            return age;
        }
        
        public void setAge(int age)
        {
            this.age = age;
        }
    }


    Serializable实现与Parcelabel实现的差别
    1)Serializable的实现,仅仅须要implements Serializable 就可以。这仅仅是给对象打了一个标记,系统会自己主动将其序列化。
    2)Parcelabel的实现,不仅须要implements Parcelabel,还须要在类中加入一个静态成员变量CREATOR,这个变量须要实现 Parcelable.Creator 接口
    參考:http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html




  • 相关阅读:
    Redis接口限流
    CentOS7以下DNS失效问题
    Vue的安装与使用
    使用 REDIS保存SESSION信息
    ThinkPHP 阿里云图片上传
    Laravel6.0+easywechat4.1获取用户授权例子与分享示例
    1.oracle创建本地数据库步骤及导入数据
    16、React Native实战之TextInput组件
    14.React Native实战之Navigator组件初探
    13.React Native实战之Text组件
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7110815.html
Copyright © 2020-2023  润新知