5.1.3自由操作随心所欲—序列化和反序列化
在Android开发中,除了经常会操作普通的文本文件和XML文件以外,也会经常使用序列化和反序列化的方式传递或者存取数据。
Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。实现Serializable接口是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,而且还可以用在IPC中。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。
下面就介绍一下使用Parcelable接口,实现两个Activity之间对象的传递,这里就要用到bundle.putParcelable实现传递对象。
1)声明实现接口Parcelable。
// import略 public class Person implements Parcelable{ protected String name; protected String age; Person(String name,String age) { this.name = name; this.age = age; } Person(Parcel in) { name = in.readString(); age = in.readString(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public int describeContents() { return 0; } /** * 实现Parcelable的方法writeToParcel,将你的对象序列化为一个Parcel对象 */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(age); } /** * 实例化静态内部对象CREATOR实现接口Parcelable.Creator */ public static final Creator<Person> CREATOR = new Creator<Person>() { public Person createFromParcel(Parcel in) { return new Person(in); } public Person[] newArray(int size) { return new Person[size]; } }; } |
2)实现Parcel对象序列化为你的对象,并将Parcelable放入Bundle中。
// import略 public class ParcelableActivity1 extends Activity { private Button myButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myButton = new Button(this); myButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 创建Person对象 Person benParcelable = new Person("testname","testage"); Intent intent = new Intent(); intent.setClass(getApplicationContext(), ParcelableActivity2.class); Bundle bundle = new Bundle(); // 将序列化对象放入bundle bundle.putParcelable("person", benParcelable); intent.putExtras(bundle); // 启动ParcelableActivity2的Activity startActivity(intent); } }); setContentView(myButton); } } |
3)实现方法createFromParcel,将Parcel对象反序列化为你的对象。
// import略 public class ParcelableActivity2 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取反序列化后的Person对象 Person parcelable = getIntent().getParcelableExtra("person"); // 打印输出 System.out.println(parcelable.getName()); System.out.println(parcelable.getAge()); } } |
--------------------------------------------
程序员赚钱不易 一定要学会理财
平安陆金所 隶属于平安集团的p2p平台
年投资回报率7%-9% 是替代银行理财的首选
个人经验 推荐投资安鑫或者有担保的彩虹项目
不要投资安e 那个几乎无法转让 想提前提现非常困难
网站链接 http://affiliate.lufax.com/action/36XBU
首次投资1000元即可额外赚几百元 不赚白不赚
--------------------------------------------
4)显示结果,如图5-2所示。
图 5-2 序列化反序列化的结果
经验分享: 除了可以利用序列化和反序列化在Activity之间传递Object类型的数据以外,我们也可以利用它来保存和读取数据。 和纯文本文件、XML文件相比,序列化文件可以是二进制的文件,而不是纯文本的,不能直接阅读。所以,如果保存的数据有一定的安全性要求,而安全性的级别又不是非常高,就可以考虑使用序列化的方式进行保存,然后使用反序列化的方式读取。 |