记录一次,getIntent().getParcelableExtra()接收数据错乱

项目涉及到通过Intent 传递一个Object对象,然而,在接收数据时,发现出现了数据错乱的问题,最后查出原因,是实体bean,在进行Parcelable序列化时,没有按照成员变量声明的顺序读取数据,导致出现获取数据出错

在一个实体类进行Parcelable序列化时,必须实现Parcelable.Creator接口,以及writeToParcel(Parcel dest, int flags) 方法,最好是通过系统自动生成,防止自己书写失手,导致传递数据出错,如果需要添加/删除变量,最好删除上面提到的接口和方法,重新生成一下,

切记,血的教训啊

public class User implements Parcelable {

    private String name;
    private String level;
    private int age;
    private int sex;
    private String id;

    protected User(Parcel in) {
        name = in.readString();
        level = in.readString();
        age = in.readInt();
        sex = in.readInt();
        id = in.readString();
    }

    /**
     * 1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:
     *      android.os.BadParcelableException:
     *     Parcelable protocol requires a Parcelable.Creator object called  CREATOR on class com.um.demo.Person
     *     2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用
     *     3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;
     *     4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
     *     5.反序列化对象
     */
    public static final Creator CREATOR = new Creator() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // 1.必须按成员变量声明的顺序封装数据,不然会出现获取数据出错
        // 2.序列化对象
        dest.writeString(name);
        dest.writeString(level);
        dest.writeInt(age);
        dest.writeInt(sex);
        dest.writeString(id);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

 

 

 

你可能感兴趣的:(android)