Android:Parcelable 和 Serializable 之间的区别?

410
为什么Android提供了两个接口来序列化对象?可序列化的对象与Android Binder和AIDL文件相互操作吗?
16个回答

3

1. Serializable

这个接口仅仅是一个标记(没有抽象方法的接口),不需要重新定义什么。

2. Parcelable

一个拥有抽象方法的接口。实现时,你需要重新定义所有的抽象方法,指定需要写入/读取哪些字段以及它们的顺序(通常Android Studio可以自动生成)。

enter image description here

实际上很少有人在Kotlin中编写Parcelable代码。为此,Kotlin提供了一个特殊的注解,它使得该接口的实现将会被自动生成。要使用它,你需要添加一个特殊的插件。

  • 在 build.gradle 文件的 plugins 部分中,添加另一个插件:id 'kotlin-parcelize'

enter image description here

  • 同步项目

你不必担心实现方法,只需要实现 Parcelable 接口并添加 @Parcelize 注解就可以了。

enter image description here

这样,一切都会很好,实现速度也很快!

结果

与 Serializable 相比,实现 Parcelable 接口的过程更快。


2

1
你可以在意图中使用可序列化( Serializable )对象,但在将一个 Parcelable 对象进行序列化时可能会出现严重的异常,如 NotSerializableException。不建议在 Parcelable 中使用 Serializable。因此最好使用 Parcelable 来扩展要与 bundle 和意图一起使用的对象。由于 Parcelable 是 Android 特定的,所以它没有任何副作用。 :)

1

我回答晚了,但是希望这篇文章能对其他人有所帮助。

就速度而言,Parcelable > Serializable。但是,自定义的Serializable是个例外。它几乎与Parcelable相当甚至更快。

参考: https://www.geeksforgeeks.org/customized-serialization-and-deserialization-in-java/

示例:

要序列化的自定义类

class MySerialized implements Serializable { 

    String deviceAddress = "MyAndroid-04"; 

    transient String token = "AABCDS"; // sensitive information which I do not want to serialize

    private void writeObject(ObjectOutputStream oos) throws Exception {
        oos.defaultWriteObject();
        oos.writeObject("111111" + token); // Encrypted token to be serialized
    }

    private void readObject(ObjectInputStream ois) throws Exception {
        ois.defaultReadObject(); 
        token = ((String) ois.readObject()).subString(6);  // Decrypting token
    }

}

0

Serializable

Serializable是一个可标记的接口,或者我们可以称之为空接口。它没有任何预先实现的方法。Serializable将要把一个对象转换成字节流,因此用户可以在一个活动和另一个活动之间传递数据。Serializable的主要优点是创建和传递数据非常容易,但与Parcelable相比,速度较慢。

Parcelable

Parcelable比Serializable更快。Parcelable将对象转换为字节流并在两个活动之间传递数据。编写Parcelable代码比序列化略微复杂。在两个活动之间传递数据时,它不会创建更多的临时对象。


Parcelable比Serializable更快。但并非总是如此! - linjiejun

0

Parcelable 可以将对象转换为字节流,在 Android 中在进程之间传递对象。

序列化将 POJO 转换为字符串(JSON 字符串),并可用于跨平台传输对象信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接