当前位置:   article > 正文

Android kotlin序列化之Parcelable详解与使用(二)_kotlin中map parcelable

kotlin中map parcelable

一、介绍

注解序列化篇:Android kotlin序列化之@Parcelize详解与使用_蜗牛、Z的博客-CSDN博客

通过上一篇注解序列化,我们已了解的kotlin的序列化比Java复杂了很多。而且有好多问题,注解虽好,但是存在一些问题。

一般在大型商业项目开发过程中,我们不仅追求极致的开发技术,更重视软件质量。过于风骚的技术同样有潜在的风险,这个时候我们还是回到本质。

二、手写Parcelable序列化

这边直接上代码:

  1. class Car(var logo:String?="") :Parcelable{
  2. var name:String?=""
  3. var numbe:Int=0
  4. constructor(parcel: Parcel) : this(parcel.readString()) {
  5. name = parcel.readString()
  6. numbe = parcel.readInt()
  7. }
  8. override fun writeToParcel(parcel: Parcel, flags: Int) {
  9. parcel.writeString(logo)
  10. parcel.writeString(name)
  11. parcel.writeInt(numbe)
  12. }
  13. override fun describeContents(): Int {
  14. return 0
  15. }
  16. companion object CREATOR : Parcelable.Creator<Car> {
  17. override fun createFromParcel(parcel: Parcel): Car {
  18. return Car(parcel)
  19. }
  20. override fun newArray(size: Int): Array<Car?> {
  21. return arrayOfNulls(size)
  22. }
  23. }
  24. }

只要继承Parcelable,IDE可以自动完成,接下来就是测试。

关于CREATOR 写法有两种

1、第一种

  1. companion object CREATOR : Parcelable.Creator<Car> {
  2. override fun createFromParcel(parcel: Parcel): Car {
  3. return Car(parcel)
  4. }
  5. override fun newArray(size: Int): Array<Car?> {
  6. return arrayOfNulls(size)
  7. }
  8. }

2、第二种

  1. companion object {
  2. @JvmField
  3. val CREATOR = object : Parcelable.Creator<Car> {
  4. override fun createFromParcel(parcel: Parcel): Car {
  5. return Car(parcel)
  6. }
  7. override fun newArray(size: Int): Array<Car?> {
  8. return arrayOfNulls(size)
  9. }
  10. }
  11. }

如果你的类中需要有其他方法加入伴生对象中,当前采用第一种无法扩展,因为一个类中只能有一个伴生对象,所以建议第二种写法。

三、复杂类序列化

简单类很好处理,即使使用注解也能完成,但是复杂对象的封装,注解存在问题。这就是我们为什么用原生继承写法。

Demo:

  1. class TestCar() :Parcelable{
  2. var car:Car?=null
  3. var list= mutableListOf<Car>()
  4. constructor(parcel: Parcel) : this() {
  5. car = parcel.readParcelable(Car::class.java.classLoader)
  6. parcel.readTypedList(list,Car.CREATOR)
  7. }
  8. @RequiresApi(Build.VERSION_CODES.Q)
  9. override fun writeToParcel(parcel: Parcel, flags: Int) {
  10. parcel.writeParcelable(car, flags)
  11. parcel.writeTypedList(list)
  12. }
  13. override fun describeContents(): Int {
  14. return 0
  15. }
  16. companion object CREATOR : Parcelable.Creator<TestCar> {
  17. override fun createFromParcel(parcel: Parcel): TestCar {
  18. return TestCar(parcel)
  19. }
  20. override fun newArray(size: Int): Array<TestCar?> {
  21. return arrayOfNulls(size)
  22. }
  23. }
  24. }

这样我们就完成了复杂的对象封装。

注意:

不要将注解类和非注解对象混合在一起使用。这样如果涉及到对象A是对象B的变量,那么序列化对象B还是会出现异常。

复杂对象测试

 

简单对象

 

四、 总结

        通过原生手写和注解两种对比,我还是建议大家不要通过注解去完成,因为出现问题无法排查,浪费时间。特别是新手,很容易被绕进去,找不到问题。

不要使用注解,不要使用注解,不要使用注解。重要事情说三遍

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/259939
推荐阅读
相关标签
  

闽ICP备14008679号