Parce Parcelable只能反序列化第一个元素

时间:2017-08-24 13:51:23

标签: android bundle

我有一个Parcelable对象,它有一个Parcelable对象列表。我试图在将一个活动从一个活动传递到另一个活动之后回读该清单,但只有第一个元素是"未捆绑的"

public class MyBundle implements Parcelable {
    private List<Data> dataList;

    public static final Parcelable.Creator<MyBundle> CREATOR = new Parcelable.Creator<MyBundle>() {
        public MyBundle createFromParcel(Parcel in) {
            return new MyBundle(in);
        }

        public MyBundle[] newArray(int size) {
            return new MyBundle[size];
        }
    };

    public MyBundle() {
    }

    public MyBundle(Parcel in) {
        //dataList = new ArrayList<>();
        //in.readTypedList(dataList, Data.CREATOR);
        dataList = in.createTypedArrayList(Data.CREATOR);
        //BOTH have the same result
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        if (dataList != null && dataList.size() > 0) {
            dest.writeTypedList(dataList);
        }
    }
}

数据对象:

/*BaseObject has the following properties:
    UUID uuid;
    long databaseId;
    createdDate;
    modifiedDate;
*/
public class Data extends BaseObject implements Parcelable {
    private String name;
    private String serial;
    private String location;

    public Data() {}

    private Data(Parcel in) {
        String uuidString = in.readString();
        if (uuidString == null) return; //this is null!
        uuid = UUID.fromString(idString);
        databaseId = in.readLong();
        createdDate = new Date(in.readLong());
        modifiedDate = new Date(in.readLong());
        location = in.readString();

        name = in.readString();
        serial = in.readString();
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(uuid.toString());
        dest.writeLong(databaseId);
        dest.writeLong(createdDate.getTime());
        dest.writeLong(modifiedDate.getTime());

        dest.writeString(name);
        dest.writeString(serial);
    }

    public static final Parcelable.Creator<Data> CREATOR
            = new Parcelable.Creator<Data>() {
        public Data createFromParcel(Parcel in) {
            return new Data(in);
        }

        public Data[] newArray(int size) {
            return new Data[size];
        }
    };
}

我尝试过:

1 个答案:

答案 0 :(得分:0)

所以这就是答案:我的Data parcelable在创建parcel时错过了location元素。当发生READING时,这显然会导致某种偏移误差。所以编码解决方案如下:

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(uuid.toString());
        dest.writeLong(databaseId);
        dest.writeLong(createdDate.getTime());
        dest.writeLong(modifiedDate.getTime());
        dest.writeString(location); /*HERE!*/
        dest.writeString(name);
        dest.writeString(serial);
    }

我希望这有助于其他人。

相关问题