【Android 】序列化对象接口Parcelable使用方法

2024-06-09 23:08

本文主要是介绍【Android 】序列化对象接口Parcelable使用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是Parcelable ?

     Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。

Parcelable 传递对象

    Android序列化对象主要有两种方法:

    1.实现Serializable接口,实现Serializable接口是JavaSE本身就支持的;

    2.实现Parcelable接口,Parcelable是Android特有的功能,效率比实现Serializable接口高,像用于Intent数据传递也都支持,而且还可以用在进程间通信(IPC),

      除了基本类型外,只有实现了Parcelable接口的类才能被放入Parcel中。

Parcelable接口定义

[java]  view plain copy print ?
  1. public interface Parcelable {  
  2.     //内容描述接口,基本不用管  
  3.     public int describeContents();  
  4.     //写入接口函数,打包  
  5.     public void writeToParcel(Parcel dest, int flags);  
  6.      //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。  
  7.     //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。  
  8.     public interface Creator<T> {  
  9.            public T createFromParcel(Parcel source);  
  10.            public T[] newArray(int size);  
  11.        }  

实现Parcelable接口?

   从parcelable接口定义中,我们可以看到,实现parcelable接口,需要我们实现下面几个方法:

   1.describeContents方法。内容接口描述,默认返回0就可以;

   2.writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下:

     writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

   3.静态的Parcelable.Creator接口,本接口有两个方法:

     createFromParcel(Parcel in)  从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。

     newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。

代码实现

    1.封装数据,把实现parcelable接口的Person对象传递到TwoActivity里;

[java]  view plain copy print ?
  1. public class DemoActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         // 封装数据  
  8.         Person p = new Person();  
  9.         p.setId(1);  
  10.         p.setName("xiaoming");  
  11.         // 用Intent传递Person对象  
  12.         Intent i = new Intent(this, TwoActivity.class);  
  13.         i.putExtra("Person", p);  
  14.         startActivity(i);  
  15.     }  
  16. }  
 2.TwoActivity获取数据,从DemoActivity传递的Person对象给解析,并打印;
[java]  view plain copy print ?
  1. public class TwoActivity extends Activity {  
  2.   
  3.   
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         // TODO Auto-generated method stub  
  7.         super.onCreate(savedInstanceState);  
  8.           
  9.         Person p = (Person)getIntent().getParcelableExtra("Person");  
  10.           
  11.         System.out.println("p_id"+p.getId());  
  12.         System.out.println("p_name"+p.getName());  
  13.     }  
  14. }  

3.parcelable接口的实现

[java]  view plain copy print ?
  1. public class Person implements Parcelable{  
  2.       
  3.     // 成员变量  
  4.     private int id;  
  5.     private String name;  
  6.       
  7.     // 1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:  
  8.     // android.os.BadParcelableException:  
  9.     // Parcelable protocol requires a Parcelable.Creator object called  CREATOR on class com.um.demo.Person  
  10.     // 2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用  
  11.     // 3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;  
  12.     // 4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错  
  13.     // 5.反序列化对象  
  14.     public static final Parcelable.Creator<Person> CREATOR = new Creator(){  
  15.   
  16.         @Override  
  17.         public Person createFromParcel(Parcel source) {  
  18.             // TODO Auto-generated method stub  
  19.             // 必须按成员变量声明的顺序读取数据,不然会出现获取数据出错  
  20.             Person p = new Person();  
  21.             p.setId(source.readInt());  
  22.             p.setName(source.readString());  
  23.             return p;  
  24.         }  
  25.   
  26.         @Override  
  27.         public Person[] newArray(int size) {  
  28.             // TODO Auto-generated method stub  
  29.             return new Person[size];  
  30.         }  
  31.     };  
  32.       
  33.     public int getId() {  
  34.         return id;  
  35.     }  
  36.   
  37.     public void setId(int id) {  
  38.         this.id = id;  
  39.     }  
  40.   
  41.     public String getName() {  
  42.         return name;  
  43.     }  
  44.   
  45.     public void setName(String name) {  
  46.         this.name = name;  
  47.     }  
  48.   
  49.     @Override  
  50.     public int describeContents() {  
  51.         // TODO Auto-generated method stub  
  52.         return 0;  
  53.     }  
  54.   
  55.     @Override  
  56.     public void writeToParcel(Parcel dest, int flags) {  
  57.         // TODO Auto-generated method stub  
  58.         // 1.必须按成员变量声明的顺序封装数据,不然会出现获取数据出错  
  59.         // 2.序列化对象  
  60.         dest.writeInt(id);  
  61.         dest.writeString(name);  
  62.     }  
  63. }  

转自:http://blog.csdn.net/zpf8861/article/details/39400725



这篇关于【Android 】序列化对象接口Parcelable使用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046561

相关文章

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

Python中配置文件的全面解析与使用

《Python中配置文件的全面解析与使用》在Python开发中,配置文件扮演着举足轻重的角色,它们允许开发者在不修改代码的情况下调整应用程序的行为,下面我们就来看看常见Python配置文件格式的使用吧... 目录一、INI配置文件二、YAML配置文件三、jsON配置文件四、TOML配置文件五、XML配置文件

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

Python中conda虚拟环境创建及使用小结

《Python中conda虚拟环境创建及使用小结》本文主要介绍了Python中conda虚拟环境创建及使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录0.前言1.Miniconda安装2.conda本地基本操作3.创建conda虚拟环境4.激活c

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J