沈阳市和平区建设局网站,中国建设工程造价管理网站,wordpress用户注册添加密码,wordpress按月归档一、介绍
注解序列化篇#xff1a;Android kotlin序列化之Parcelize详解与使用_蜗牛、Z的博客-CSDN博客
通过上一篇注解序列化#xff0c;我们已了解的kotlin的序列化比Java复杂了很多。而且有好多问题#xff0c;注解虽好#xff0c;但是存在一些问题。
一般在大型商业…一、介绍
注解序列化篇Android kotlin序列化之Parcelize详解与使用_蜗牛、Z的博客-CSDN博客
通过上一篇注解序列化我们已了解的kotlin的序列化比Java复杂了很多。而且有好多问题注解虽好但是存在一些问题。
一般在大型商业项目开发过程中我们不仅追求极致的开发技术更重视软件质量。过于风骚的技术同样有潜在的风险这个时候我们还是回到本质。 二、手写Parcelable序列化
这边直接上代码 class Car(var logo:String?) :Parcelable{var name:String?var numbe:Int0constructor(parcel: Parcel) : this(parcel.readString()) {name parcel.readString()numbe parcel.readInt()}override fun writeToParcel(parcel: Parcel, flags: Int) {parcel.writeString(logo)parcel.writeString(name)parcel.writeInt(numbe)}override fun describeContents(): Int {return 0}companion object CREATOR : Parcelable.CreatorCar {override fun createFromParcel(parcel: Parcel): Car {return Car(parcel)}override fun newArray(size: Int): ArrayCar? {return arrayOfNulls(size)}}} 只要继承ParcelableIDE可以自动完成接下来就是测试。
关于CREATOR 写法有两种
1、第一种
companion object CREATOR : Parcelable.CreatorCar {override fun createFromParcel(parcel: Parcel): Car {return Car(parcel)}override fun newArray(size: Int): ArrayCar? {return arrayOfNulls(size)}}
2、第二种 companion object {JvmFieldval CREATOR object : Parcelable.CreatorCar {override fun createFromParcel(parcel: Parcel): Car {return Car(parcel)}override fun newArray(size: Int): ArrayCar? {return arrayOfNulls(size)}}}
如果你的类中需要有其他方法加入伴生对象中当前采用第一种无法扩展因为一个类中只能有一个伴生对象所以建议第二种写法。 三、复杂类序列化
简单类很好处理即使使用注解也能完成但是复杂对象的封装注解存在问题。这就是我们为什么用原生继承写法。
Demo
class TestCar() :Parcelable{var car:Car?nullvar list mutableListOfCar()constructor(parcel: Parcel) : this() {car parcel.readParcelable(Car::class.java.classLoader)parcel.readTypedList(list,Car.CREATOR)}RequiresApi(Build.VERSION_CODES.Q)override fun writeToParcel(parcel: Parcel, flags: Int) {parcel.writeParcelable(car, flags)parcel.writeTypedList(list)}override fun describeContents(): Int {return 0}companion object CREATOR : Parcelable.CreatorTestCar {override fun createFromParcel(parcel: Parcel): TestCar {return TestCar(parcel)}override fun newArray(size: Int): ArrayTestCar? {return arrayOfNulls(size)}}} 这样我们就完成了复杂的对象封装。 注意
不要将注解类和非注解对象混合在一起使用。这样如果涉及到对象A是对象B的变量那么序列化对象B还是会出现异常。 复杂对象测试 简单对象 四、 总结 通过原生手写和注解两种对比我还是建议大家不要通过注解去完成因为出现问题无法排查浪费时间。特别是新手很容易被绕进去找不到问题。 不要使用注解不要使用注解不要使用注解。重要事情说三遍