Parcelable和Serializable的理解
来源:互联网 发布:青岛淘宝培训班 编辑:程序博客网 时间:2024/06/06 12:29
很少在博客上敲文本了,都是直接上代码就结束了,今天抽点时间写点东西。
我们知道在一般情况下,在两个或者多个Activity中传递数据中通过Intent的函数只能传递基本数据类型,那当我们想传输复杂的类的数据类型时候,我们就必须用到Parcelable或者Serializable接口经行传递数据。
Parcelable和Serializable都是能对数据经行序列化,将数据转化成字节流的方式进行传输,当这些字节流传输完毕后再对其进行反序列化,达到传输复杂数据的目的。
Serializable接口是原先Java Se中就存在的Api,但是在google公司在Android中又添加了Parcelable接口,为什么呢?第一,Parcelable比Serializable的传输速率要快很多倍,大概十倍左右(具体不知道),所以实现Parcelable接口可能提高程序的性能。第二,Parcelable可以进行IPC通讯,即跨进程通讯,这是Serializable做不到的。还有一些优点大家可以摸索,我就不累述了。
不说了,上代码
package com.example.administrator.test;import android.os.Parcel;import android.os.Parcelable;/** * Created by hd on 2015/12/16. */public class Student implements Parcelable { private String name; private int age; private String address; 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; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public static final Creator<Student> CREATOR = new Creator<Student>() { @Override public Student createFromParcel(Parcel in) { Student a = new Student(); a.setName(in.readString()); a.setAddress(in.readString()); a.setAge(in.readInt()); return a; } @Override public Student[] newArray(int size) { return new Student[0]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(address); dest.writeInt(age); } @Override public String toString() { return "name:" + name + "\n" + "address:" + address + "\n" + "age:" + age; }}
可以看到,在这个bean中我实现了Parcelable接口,我们需要实现一些接口中的方法:
public int describeContents();
对接口的描述,可以直接return 0;
public void writeToParcel(Parcel dest, int flags);
这个方法提供一个Parcel对象,在传递中就是通过将数据保存在这个对象中进行传递,所以我们要对这个Parcel进行写入数据的操作。至于flag参数只是作为一个标记,你可以在添加在数据中传递。
/** * 此接口必须被实现,并且需要写成public权限以及对象名为CREATOR(必须大写) */ public interface Creator<T> { public T createFromParcel(Parcel source); public T[] newArray(int size); }
这是一个Parcelable内部的一个接口, 其中createFromParcel就是从Parcel中反序列化数据。
注意:
// 1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:
// android.os.BadParcelableException:
// Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.um.demo.Person
// 2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用
// 3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;
// 4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
// 5.反序列化对象
package com.example.administrator.test;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity { private Button btnSend; private Button btnSeriaSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnSend = (Button) findViewById(R.id.btnSend); btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); Student a = new Student(); a.setName("小明"); a.setAddress("福建"); a.setAge(25); intent.setFlags(0); intent.setClass(MainActivity.this, SecondActivity.class); intent.putExtra("hd", a); startActivity(intent); } }); btnSeriaSend = (Button) findViewById(R.id.btnSeriaSend); btnSeriaSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); Teacher t = new Teacher(); intent.setFlags(1); t.setName("小红"); t.setAddress("浙江"); t.setAge(24); intent.putExtra("hd", t); intent.setClass(MainActivity.this, SecondActivity.class); startActivity(intent); } }); }}
package com.example.administrator.test;import java.io.Serializable;/** * Created by hd on 2015/12/16. */public class Teacher implements Serializable { private String name; private String address; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "name:" + name + "\n" + "address:" + address + "\n" + "age:" + age; }}
这是Serializable的序列化,很简单,直接实现接口就行,但是不推荐噢。
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.administrator.test.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tvTest"/></RelativeLayout>
- Parcelable和Serializable的理解
- Serializable 和Parcelable接口理解
- 序列化Serializable和Parcelable的理解和区别
- 序列化Serializable和Parcelable的理解和区别
- 序列化Serializable和Parcelable的理解和区别
- 序列化Serializable和Parcelable的理解和区别
- parcelable和serializable 的区别。
- Parcelable和Serializable的差别
- Parcelable和Serializable的区别
- Parcelable和Serializable的区别:
- Parcelable和Serializable的区别
- Serializable和Parcelable的区别
- Parcelable和Serializable的区别
- Serializable和Parcelable的用法
- Parcelable和Serializable的区别
- Parcelable和Serializable的区别?
- Serializable 和 Parcelable 的选择
- Serializable和Parcelable的区别
- android------使用TextView链接打开一个Activity
- 轻量级JavaEE企业应用实战(五)
- Xcode7.1中帮助文档(Documentation and API Reference)的位置以及自行安装帮助文档的方法
- Android VectorDrawable与SVG
- 第14周 项目2 - 二叉树排序树中查找的路径
- Parcelable和Serializable的理解
- 自定义View音量调节
- Mysql学习之cannot add foreign key constraint
- NSLogger使用
- ref 和out以及params参数详解
- 通用的自定义BaseActivity类,集成多种基本功能
- Webdriver Ui自动化测试,使用工厂方法生产不同浏览器的webdriver实例
- 百度地图v3.6.1接入1--基本地图功能
- CentOS7.1下python2.7.10安装PyQt4