使用Intent传递对象之序列化操作

1,468 阅读1分钟

其含义就是将一个对象转换为可存储或者可传输的状态。序列化之后的对象可以在网络上进行传输,也可以存储到本地。至于序列化非常简单,只需要他们继承Serializable或者Parcelable即可

推荐使用Parcelable,因为根据其原理,比较节省性能

Serializable

  • 对对象进行了序列化,比较耗费性能
package com.example.serializabledemo.model

import java.io.Serializable

class Person : Serializable {
    var name = ""
    var age = 0
}
  • 使用
package com.example.serializabledemo

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.example.serializabledemo.model.Person3

class SecondActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val person = intent.getSerializableExtra("person_data") as Person
        Log.d("Person is ", person.age.toString())
    }
}

Parcelable

  • 原理是将对象进行分解,每一部分都是Intent支持的类型,所以性能更好,更为推荐
  • 第一种方式:
package com.example.serializabledemo.model

import android.os.Parcel
import android.os.Parcelable

class Person2 : Parcelable {
    var name: String = ""
    var age: Int = 0
    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest.writeString(name)
        dest.writeInt(age)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Person> {
        override fun createFromParcel(source: Parcel): Person {
            val person = Person()
            person.name = source.readString() ?: "" // 读取name
            person.age = source.readInt() // 读取age
            return person
        }

        override fun newArray(size: Int): Array<Person?> {
            return arrayOfNulls(size)
        }

    }
}
  • kotlin之更为简单的写法
package com.example.serializabledemo.model

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
class Person3(var name: String, var age: Int) : Parcelable
  • 使用
package com.example.serializabledemo

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.example.serializabledemo.model.Person3

class SecondActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val person = intent.getParcelableExtra("person_data") as Person3
        Log.d("Person is ", person.age.toString())
    }
}