• Android Parcelable 序列化复杂数据结构


      参考博文 http://blog.csdn.net/yangzl2008/article/details/7593226

      由于项目需要,Activity之间要传递一个特别复杂的数据结构对象,由于以前序列化直接是用Serializable,但是Serializable无法传递复杂的数据结构,查看Bundle的方法,知道了Parcelable

      Parcelable的使用看起来挺复杂,其实也挺简单,就是使用writeToParcel(Parcel dest,int flags)方法将自己类中的属性写入Parcel对象,接收的时候用CREATOR中的createFromParcel(Parcel in)解析出来。

      我遇到的难点在于数据结构中有枚举型和多层次的List集合:

      由于Enum实现了Serializable接口,可以通过in.readSerializable()进行读入,还可以通过enum对象的.ordinal()方法获得枚举值的索引写入Parcel对象,在用in.readInt()读出然后解析出枚举值。

      至于List集合的序列化就伤了我,说一下我做的过程吧。

      1.Parcelable有两个方法是ArrayList<MyClass> list = in.readArrayList(ClassLoader); in.readList(List , ClassLoader)这时候就涉及到ClassLoader参数的设置,查看源码有好多的ClassLoader选择,我当时就选择了一个Serializable.class.getClassLoader()这个,然后序列化的结果是将List集合序列化成了一个数字,然后传到下一个Activity中的适配器的时候就转换错误。也就是这种方法没解决问题,不过我想这种方法应该是能实现的,只是哪里还有问题,没写对。如果读者有按这种思路实现了的我们可以交流交流。

      2.Parcelable中还有个方法 in.readTypedList(recodeList,TrainRecode.CREATOR); 第一个参数是输出的List集合,第二个参数是List子元素类中的CREATOR静态常量。

         按照这种方法试验成功,序列化传递正常。

      3.在StackOverFlow上看到的一种方法是

      List<Object> myList = null;
    
      parcel.readList(myList,List.class.getClassLoader());
      category.setCategoryVideos(myList);
      使用的是List.class.getClassLoader()的类装载器,不过我没试过,不知道是否可行。

      注意:其中在写writeToParcel(...)方法和createFromParcel(...)方法中Parcel对象写入和读取的顺序要一致,不然会出现顺序异常和乱码。

  • 相关阅读:
    HLSL定义float4 Pos:POSITION的寄存器绑定问题(Render Monkey)
    Chapter 9-May There Be Light之点光源及其衰减
    Chapter 15-Watch Out for That Morning Fog之体积雾及体积雾场景混合
    Chapter 12-Not All Materials Are the Same
    Chapter 11-Mirror, Mirror, On the Wall之反射跟折射
    Render Monkey中可渲染纹理的Clear Color
    Chapter8-Making Your Day Brighter之使用Non-floating Texture来实现HDR特效
    Chapter8-Making Your Day Brighter之Lens Flare & put all together
    Chapter8-Making Your Day Brighter之The Streak
    Chapter8-Making Your Day Brighter之Your First HDR Shader: The Glare!
  • 原文地址:https://www.cnblogs.com/evilKing/p/4757472.html
Copyright © 2020-2023  润新知