[关闭]
@Arbalest-Laevatain 2018-08-22T02:23:27.000000Z 字数 2418 阅读 545

序列化对象(Parcelable方法)

Android


为什么需要这种方法

在某些时候需要把对象、对象数组整个从一个Activity传值到另外一个Activity时,需要先把对象的类序列化,再做操作
Parcelable法只是其中一种方法

主要步骤

1、将需要序列化的类实现Parcelable接口。

2、重写writeToParcel方法

将对象序列化为一个Parcel对象。

3、重写describeContents方法

描述内容接口,默认返回0。实例化静态内部对象CREATOR实现接口Parcelable.Creator。其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。需重写本接口中的两个方法:

将原本的进行改造代码

原来的类代码

  1. package com.example.administrator.myapplication01;
  2. public class SZcezhan{
  3. double qianshiju;//定义前视距
  4. double houshiju;//定义后视距
  5. double shijucha;//视距差
  6. double shijuleijicha;//视距累积差
  7. int qiandushucha;//定义了前视黑红面读数差
  8. int houdushucha;//定义了后视黑红面读数差
  9. int heigaocha;//黑面高差
  10. int honggaocha;//红面高差
  11. int gaochacha;//定义了红黑面高差之差
  12. int zhuandian;//测段前视点的转点标识
  13. double gaochazhongshu;//高差中数
  14. }

改造后

  1. package com.example.administrator.myapplication01;
  2. import android.os.Parcel;
  3. import android.os.Parcelable;
  4. import java.io.Serializable;
  5. /**
  6. * Created by Administrator on 2018/7/24.
  7. */
  8. public class SZcezhan implements Parcelable{
  9. double qianshiju;//定义前视距
  10. double houshiju;//定义后视距
  11. double shijucha;//视距差
  12. double shijuleijicha;//视距累积差
  13. int qiandushucha;//定义了前视黑红面读数差
  14. int houdushucha;//定义了后视黑红面读数差
  15. int heigaocha;//黑面高差
  16. int honggaocha;//红面高差
  17. int gaochacha;//定义了红黑面高差之差
  18. int zhuandian;//测段前视点的转点标识
  19. double gaochazhongshu;//高差中数
  20. protected SZcezhan(Parcel in) {
  21. // 在读取Parcel容器里的数据时,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
  22. qianshiju = in.readDouble();
  23. houshiju = in.readDouble();
  24. shijucha = in.readDouble();
  25. shijuleijicha = in.readDouble();
  26. qiandushucha = in.readInt();
  27. houdushucha = in.readInt();
  28. heigaocha = in.readInt();
  29. honggaocha = in.readInt();
  30. gaochacha = in.readInt();
  31. zhuandian = in.readInt();
  32. gaochazhongshu = in.readDouble();
  33. }
  34. public static final Creator<SZcezhan> CREATOR = new Creator<SZcezhan>() {
  35. // 再通过createFromParcel将Parcel对象映射成原对象
  36. @Override
  37. public SZcezhan createFromParcel(Parcel in) {
  38. return new SZcezhan(in);
  39. }
  40. // 供外部类反序列化本类数组使用
  41. @Override
  42. public SZcezhan[] newArray(int size) {
  43. return new SZcezhan[size];
  44. }
  45. };
  46. // 内容接口描述,默认返回0即可
  47. @Override
  48. public int describeContents() {
  49. return 0;
  50. }
  51. // 按照声明顺序打包数据到Parcel对象中,既将数据打包到Parcel容器中
  52. @Override
  53. public void writeToParcel(Parcel dest, int flags) {
  54. dest.writeDouble(qianshiju);
  55. dest.writeDouble(houshiju);
  56. dest.writeDouble(shijucha);
  57. dest.writeDouble(shijuleijicha);
  58. dest.writeInt(qiandushucha);
  59. dest.writeInt(houdushucha);
  60. dest.writeInt(heigaocha);
  61. dest.writeInt(honggaocha);
  62. dest.writeInt(gaochacha);
  63. dest.writeInt(zhuandian);
  64. dest.writeDouble(gaochazhongshu);
  65. }
  66. public SZcezhan() {
  67. //this.name = "未知";
  68. //this.age = 18;
  69. }
  70. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注