14

我有一个类,我们称之为 A 类,它实现了 Parcelable。

我有第二个类,我们称之为 B 类,它扩展了 A 类。

我的问题是:

如何将 B 类的成员变量写入 Parcel,然后将其父类(即:A 类)的成员变量写入 Parcel(并随后将它们读入)?

不需要重写 A 类的包裹代码有什么妙招吗?还是我只需要重写 A 类中的 Parcel 代码并为 B 类的成员变量添加额外的代码?

4

3 回答 3

22

如何将 B 类的成员变量写入 Parcel,然后将其父类(即:A 类)的成员变量写入 Parcel

BwriteToParcel()类从 A 类覆盖,链接到超类,并将其自己的对象添加到Parcel.

(并随后读入)?

B 类public static final Parcelable.Creator<MyParcelable> CREATOR以这样一种方式实现,它可以让两个类都读取它们的内容。如果您采用在 B 类上创建一个以 aParcel作为构造函数参数的构造函数的方法,只需链接到超类构造函数(让 A 类执行它的工作),然后读取 B 类的数据。

关键是要以相同的顺序执行它们。如果您打算让 A 类先读取其数据,则 A 类必须先写入其数据。

不需要重写 A 类的包裹代码有什么妙招吗?

继承和链接到超类。

于 2012-05-31T21:24:33.097 回答
4

添加一个例子,标记的答案确实是正确的,但是更直观的东西似乎更适合这种情况:

这将是晚餐课程:

public class BasePojo implements Parcelable {

    private String something;

    //what ever other constructor

    //getters and setters

    protected BasePojo(Parcel in) {
        something = in.readString();
    }

    public static final Creator<BasePojo> CREATOR = new Creator<BasePojo>() {
        @Override
        public BasePojo createFromParcel(Parcel in) {
            return new BasePojo(in);
        }

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

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(something);
    }

}

然后这将是子类:

public class ChildPojo extends BasePojo implements Parcelable {

    private int somethingElse;

    //what ever other constructor

    //getters and setters

    protected ChildPojo(Parcel in) {
        super(in);
        somethingElse = in.readInt();
    }

    public static final Creator<ChildPojo> CREATOR = new Creator<ChildPojo>() {
        @Override
        public ChildPojo createFromParcel(Parcel in) {
            return new ChildPojo(in);
        }

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

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        super.writeToParcel(parcel, i);
        parcel.writeInt(somethingElse);
    }

}

标记的答案提供了一个很好的解释,调用 super 是关键。

于 2018-02-22T17:55:09.330 回答
1

这有点复杂,但诀窍是使用反射来获取子类成员的类型并对成员进行排序,以便您可以使用正确的类型以相同的确切顺序读取和写入数据。

我在这里实现了 A 类的解决方案:https ://github.com/awadalaa/Android-Global-Parcelable

所以现在你可以通过简单地扩展这个类来使任何类可打包。

于 2013-09-27T20:50:50.920 回答