移动开发-序列化与反序列化Parcelable和Serializable浅析

发布于:2023-08-07 01:01:42

移动开发-序列化与反序列化Parcelable和Serializable浅析

序列化和反序列化是移动开发中常用的概念。它们的作用是将一个对象转化为一段字节序列,以便在网络传输、文件存储或进程通信等场景下进行传输和存储。通常情况下,我们使用 Java 中的两种标准序列化方式,即 Parcelable 和 Serializable。

Parcelable 是 Android SDK 提供的一种轻量级的序列化方法,专门用于 Android 中的对象传输。相对于 Serializable,它的序列化和反序列化速度更快、占用的内存更少,尤其适合在移动设备上使用。

Serializable 是 Java 自带的序列化接口,可以将一个对象转换成一串字节序列。虽然 Serializable 也可以用于 Android 应用程序开发,但是由于其序列化和反序列化的效率较低,并且在不同的版本之间存在兼容性问题,因此在 Android 中使用起来相对不太常见。

下面我们分别介绍一下 Parcelable 和 Serializable 的使用方法和注意事项。

1. 使用 Parcelable

a. 实现 Parcelable 接口

使用 Parcelable,*先需要让我们的类实现 Parcelable 接口,并重写其中的方法。Parcelable 接口中有两个主要的方法:

- writeToParcel(Parcel out, int flags) : 把对象转换成写入 Parcel 的序列化数据。- describeContents() : 标识当前 Parcelable 实例的特殊对象类型,返回 0 或标识当前对象所包含的类所支持特殊对象类型的值。

b. 读写 Parcel

为了实现读取和写入 Parcel 中的数据,我们需要关注两个问题:

- 写入:在 writeToParcel(Parcel out, int flags) 方法中,我们需要将对象序列化后写入 Parcel 中,这个过程需要用到 Parcel 的一些方法,比如 writeString()、writeInt() 等。- 读取:在类中必须要有一个 Creator 对象,实现 createFromParcel(Parcel parcel) 和 newArray(int size) 方法。createObject() 方法中,我们需要取回序列化后的各个成员变量的值,这个过程需要使用到 Parcel 的一些方法,比如 readString(),readInt() 等。

c. 将 Parcelable 对象传输到其他组件

Parcelable 是 Android 中专门为传递对象数据所设计的,所以当我们需要将一个 Parcelable 对象传递到其他组件时,可以直接使用 Intent 的方法来传递,例如:

```MyParcelable p = new MyParcelable();Intent intent = new Intent(this, NextActivity.class);intent.putExtra("parcel", p);startActivity(intent);```

2. 使用 Serializable

a. 实现 Serializable 接口

使用 Serializable,*先需要让我们的类实现 Serializable 接口,并添加 serialVersionUID 变量,以区别不同版本间的兼容性。例如:

```public class MyClass implements Serializable {private static final long serialVersionUID = 1L;// ...}```

b. 序列化对象

序列化和反序列化的过程都需要使用到 java.io 包中的 ObjectOutputStream 和 ObjectInputStream。例如,对于一个 MyClass 对象,我们可以将其序列化成字节流:

```MyClass obj = new MyClass();ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(obj);byte[] data = bos.toByteArray();```

c. 反序列化对象

反序列化对象也需要使用到 java.io 包中的 ObjectInputStream。假设我们已经有了一个字节数组 byte[] data,并且知道该数组中存储的是一个 MyClass 对象,我们可以通过如下代码来反序列化这个对象:

```ByteArrayInputStream bis = new ByteArrayInputStream(data);ObjectInputStream ois = new ObjectInputStream(bis);MyClass obj2 = (MyClass) ois.readObject();```

总结

在 Android 移动开发中,我们通常使用 Parcelable 来实现对象的序列化和反序列化,因为 Parcelable 的实现速度快,所占内存小。然而,如果需要与其他平台、其他数据源进行交互,通常还是需要使用 Serializable 的。

无论是使用 Parcelable 还是 Serializable,都需要注意以下几点:

- 序列化过程中,需要考虑到类中各个成员变量的类型、序列化顺序等问题。- 在写入和读取 Parcel 数据时,需要使用到一系列的 write 和 read 相关的方法,用以保证序列化和反序列化过程的正确性。- 在反序列化过程中,需要注意类的版本兼容性,即 serialVersionUID 变量的值是否匹配,否则可能导致反序列化失败。- 在使用 Parcelable 进行对象序列化时,由于 Android 运行时已自动把所有对象存入了一个移动设备的垃圾回收堆中,因此处理能力较为有限,如果某个对象的类比较大,则可能导致序列化和反序列化较慢。而对于 Serializable,这个问题就不存在。


免责声明:本站所有内容及图片均采集来源于网络,并无商业使用,如若侵权请联系删除。

上一篇:如何让网站充满亮点

下一篇:网站建设设计中易忽视的5大方面

资讯 观察行业视觉,用专业的角度,讲出你们的心声。
MORE

I NEED TO BUILD WEBSITE

我需要建站

*请认真填写需求信息,我们会在24小时内与您取得联系。