首页 » Android程序设计:第2版 » Android程序设计:第2版全文在线阅读

《Android程序设计:第2版》序列化

关灯直达底部

序列化是指把数据从快速、高效的内部表现方式转换成可在网络上持久存储或传输的形式。把数据转换成序列化形式通常称为对该数据执行marshaling(编组)。把数据转换回其活跃的、在内存内的表现形式即称为反序列化(deserializing)或unmarshaling。

究竟应该如何对数据执行序列化取决于其序列化的原因。例如,为了网络传输执行的数据序列化,在传输过程中的数据可能是不可读的。但是,对于保存在数据库中的序列化数据,如果数据的表现形式使得编写SQL查询简单容易,那将是很有用的。对于网络传输,序列化可能是二进制形式;对于数据库存储,则可能是带标签的文本形式。Android环境提供了4种常见的序列化使用方式。

生命周期管理

和较大的设备(如笔记本和台式机)不同,不能指望Android设备在应用僵死时,能够把应用切换到快速的备用存储上。相反,Android框架提供了一种对象,称为Bundle。当应用挂起时,它把状态写入Bundle。当重新创建应用时,Android框架能够提供一份和该应用启动时相同的Bundle副本。应用必须能够对其挂起期间想要保存的信息都能够执行序列化,并且把序列化后的版本保存到Bundle中。

持久性

除了在Bundle中所保存的即时应用状态,绝大多数应用都管理着一些持久性数据存储。这些数据很可能是封装在ContentProvider中的SQLite数据库中。应用必须能够在对象数据的内部表现和这些对象在数据库中的表现之间进行切换。在较大型的系统中,这个过程称为对象关系映射object relational mapping或ORM,其由类似Hibernate和iBATIS这样的框架支持。Android的本地数据存储更简单和轻量级,第9章会对它进行介绍。

本地进程间通信

Android框架提倡的架构支持把较大的单个应用分解成小的组件:一组UI、内容提供者和服务。这些组件无法相互访问对方的内存空间,必须使用序列化消息在进程间传递。Android为此提供了一个高度优化的工具:AIDL。

网络通信

网络通信是移动设备极其重要的一个功能。支持连接到互联网并使用互联网上各种各样的服务也正是Android要实现的。应用必须能够处理外部服务要求的各种协议,包括把内部信息翻译成对这些服务的查询,并把服务返回的结果重新翻译回来。

以下各节描述了为实现这些目标,会使用到的各个相关的类。

Java序列化

Java通过Serializable标记接口,以及一对序列化类型ObjectOutputStream和ObjectInputStream,来定义其序列化框架。因为大多数情况下Java序列化都能够正常工作,即使经验丰富的Java程序员可能都没有意识到其复杂性。关于Java序列化的探讨显然超出了本书的范畴。Josh Bloch在他的著作《Effective Java》。 [1](Prentice Hall出版社出版)一书中,以接近10%的篇幅详细探讨了Java序列化框架及如何正确使用它。即使你并不想用Java框架,其关于Java序列化一节的探讨也值得一读。

Android支持Java序列化。举个例子,Bundle类有两个方法putSerializable和getSerializable,它们分别执行把Java Serializable对象插入Bundle中以及从Bundle中获取Java Serializable对象。例如:


public class JSerialize extends Activity {      public static final String APP_STATE            = /"com.oreilly.android.app.state/";      private static class AppState implements Serializable {            // definitions, getters and setters            // for application state parameters here.            // ...      }      private AppState applicationState;      /** Called when the activity is first created. */      @Override      public void onCreate(Bundle savedAppState) {            super.onCreate(savedAppState);            applicationState = (null == savedAppState)                  ? new AppState(/* ... */)                  : (AppState) savedAppState.getSerializable(APP_STATE);            setContentView(R.layout.main);            // ...      }      /**       * @see android.app.Activity#onSaveInstanceState(android.os.Bundle)       */      @Override      protected void onSaveInstanceState(Bundle outState) {            super.onSaveInstanceState(outState);            outState.putSerializable(APP_STATE, applicationState);      }}  

在这个例子中,应用以Serializable对象的方式保存了一些全局状态信息——可能是最近使用项的列表。当要暂停一个JSerialize activity,而在内存中执行另一个activity时,Android框架会调用JSerialize的回调方法onSaveInstanceState,传递一个Bundle对象。回调方法使用Bundle.putSerializable把对象的状态保存到Bundle中。当恢复JSerialize方法时,onCreate方法使用getSerializable方法从Bundle中获取状态。

[1] 中文版已由机械工业出版社出版,书号为978-7-111-25583-3。