Android - Sérialisable和Parcelable

1. IntroductionSérialisable

Sérialisable signifie sérialisation, c'est-à-dire convertir un objet en un état stockable ou transférable. Les objets sérialisés peuvent être transmis sur le réseau ou stockés localement. Quant à la méthode de sérialisation, c'est très simple, il suffit de laisser une classe implémenter l'interface Serializable.

Par exemple, il y a une classe Person qui contient deux champs name et age. Si vous voulez la sérialiser, vous pouvez l'écrire comme ceci :

class Person : Serializable {
 var name = ""
 var age = 0
}

Ici, nous laissons la classe Person implémenter l'interface Serializable, afin que tous les objets Person soient sérialisables. Ensuite, écrivez simplement ceci dans FirstActivity :

val person = Person()
person.name = "Tom"
person.age = 20
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("person_data", person)
startActivity(intent)

Comme vous pouvez le voir, nous créons ici une instance de Person et la passons directement dans la méthode putExtra() de Intent. Étant donné que la classe Person implémente l'interface Serializable, elle peut être écrite comme ceci.

Ensuite, il est également très simple d'obtenir cet objet dans SecondActivity, écrit comme suit :

val person = intent.getSerializableExtra("person_data") as Person

Ici, la méthode getSerializableExtra() de l'Intent est appelée pour obtenir l'objet sérialisé transmis via le paramètre, puis il est converti en objet Person, de sorte que nous avons réalisé avec succès la fonction d'utilisation de l'Intent pour transférer l'objet.

Il convient de noter que le principe de fonctionnement de cet objet de transfert est de sérialiser un objet dans un état stockable ou transférable, de le transmettre à une autre activité, puis de le désérialiser dans un nouvel objet. Bien que les données stockées dans ces deux objets soient exactement les mêmes, ce sont en fait des objets différents, ce que j'espère que vous comprendrez clairement.

2. Colisable

En plus de Serializable, Parcelable peut également être utilisé pour obtenir le même effet, mais contrairement à la sérialisation d'objets, le principe de mise en œuvre de Parcelable est de décomposer un objet complet, et chaque partie après décomposition correspond aux données prises en charge par Intent Type, de sorte que la fonction de passage d'objets peut être réalisé.

class Person : Parcelable {
 var name = ""
 var age = 0
 override fun writeToParcel(parcel: Parcel, flags: Int) {
 parcel.writeString(name) // 写出name
 parcel.writeInt(age) // 写出age
 }
 override fun describeContents(): Int {
 return 0
 }
 companion object CREATOR : Parcelable.Creator<Person> {
 override fun createFromParcel(parcel: Parcel): Person {
 val person = Person()
 person.name = parcel.readString() ?: "" // 读取name
 person.age = parcel.readInt() // 读取age
 return person
 }
 override fun newArray(size: Int): Array<Person?> {
 return arrayOfNulls(size)
 }
 }
}

La mise en œuvre de Parcelable est légèrement plus compliquée. Comme vous pouvez le voir, nous laissons d'abord la classe Person implémenter l'interface Parcelable, nous devons donc réécrire les deux méthodes describeContents() et writeToParcel(). Parmi eux, la méthode describeContents() peut renvoyer directement 0, et dans la méthode writeToParcel(), nous devons appeler la méthode writeXxx() de Parcel pour écrire les champs de la classe Person un par un. Notez que la méthode writeString() est appelée pour les données de chaîne, la méthode writeInt() est appelée pour les données entières, etc.

En plus de cela, nous devons fournir une implémentation de classe anonyme appelée CREATOR dans la classe Person. Ici, une implémentation de l'interface Parcelable.Creator est créée et le type générique est spécifié en tant que Person. Ensuite, nous devons réécrire les deux méthodes createFromParcel() et newArray(). Dans la méthode createFromParcel(), nous devons créer un objet Person à renvoyer, et lire les champs name et age qui viennent d'être écrits. Parmi eux, le nom et l'âge sont lus en appelant la méthode readXxx() de Parcel. Notez que l'ordre de lecture ici doit être exactement le même que l'ordre qui vient d'être écrit. L'implémentation dans la méthode newArray() est beaucoup plus simple. Il vous suffit d'appeler la méthode arrayOfNulls() et d'utiliser la taille passée en paramètre comme taille de tableau pour créer un tableau Person vide.

Ensuite, nous pouvons toujours utiliser le même code pour transmettre l'objet Person dans FirstActivity, mais nous devons apporter une légère modification lors de l'obtention de l'objet dans SecondActivity, comme indiqué ci-dessous.

val person = intent.getParcelableExtra("person_data") as Person

Notez que la méthode getSerializableExtra() n'est plus appelée ici, mais la méthode getParcelableExtra() est appelée pour obtenir l'objet passé, et les autres endroits sont exactement les mêmes.

Cependant, cette méthode d'implémentation est vraiment compliquée à écrire, c'est pourquoi Kotlin nous propose un autre usage plus pratique, mais le postulat est que toutes les données à passer doivent être encapsulées dans le constructeur principal de l'objet.

Modifiez le code dans la classe Person comme suit :

@Parcelize
class Person(var name: String, var age: Int) : Parcelable

Oui, il est aussi simple que cela. Déplacez les deux champs de nom et d'âge vers le constructeur principal, puis ajoutez une annotation @Parcelize à la classe Person.Est-ce beaucoup plus simple que l'utilisation précédente ?

Guess you like

Origin blog.csdn.net/m0_59482482/article/details/130482814