val file = File(“aaaa”)
file.createNewFile()
///序列化过程
ObjectOutputStream(FileOutputStream(file))
.use {
it.writeObject(User(“张三”))
}
///反序列化
val user: User? =
ObjectInputStream(FileInputStream(file)).use {
it.readObject() as User?
}
println(“序列化结果”)
println(user?.name)
上述代码完成了Serializable
方式序列化的整个过程。很简单,直接使用ObjectOutputStream
和 ObjectInputStream
就可以了。
========================================================================
介绍完Serializable,再来看看Parcelable 。Parcelable也是一个接口,只要实现这个接口,就可以实现序列化并通过intent和binder进行传递。看看一个经典的用法:
class User(val name: String? = “小王”) : Parcelable {
constructor(parcel: Parcel) : this(parcel.readString()) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(name)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator {
override fun createFromParcel(parcel: Parcel): User {
return User(parcel)
}
override fun newArray(size: Int): Array<User?> {
return arrayOfNulls(size)
}
}
}
可以看到有这么四个自定义的方法,说明如下:
-
writeToParcel 实现序列化功能,写入到parcel
-
describeContents 提供内容描述,几乎都是返回0,只有在存在文件描述符的时候才返回1
-
createFromParcel 实现反序列功能,从序列化后的对象中创建原始对象
-
newArray 提供数组容器
Parcelale
和Serializable
都能实现序列化,怎么选呢?我们可以根据两种方案的区别来选择。Serializable
使用简单,但是开销比较大,在序列化和反序列化的过程中需要大量的I/O操作。而Parcelable
的使用稍微复杂一些,但是性能比较好是Android 推荐的序列化方式。所以在进行内存传递的时候,可以使用Parcelable
进行序列化,但是在涉及到持久化和网络传输的时候,Parcelabl