Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Parceling Parent Class Fields #26

@KennethNickles

Description

@KennethNickles

I have two classes:

@Parceled
public class A implements Parcelable {

    public static final Creator<A> CREATOR = Postman.getCreator(A.class);

    State mState;

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        Postman.writeToParcel(this, dest);
    }

    @Parceled
    public static class State implements Parcelable {

        public static final Creator<State> CREATOR = Postman.getCreator(State.class);

        // Postman Fields

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

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            Postman.writeToParcel(this, dest);
        }
    }
}

and

@Parceled
public class B extends A implements Parcelable {

    public static final Creator<B> CREATOR = Postman.getCreator(B.class);

    State mState

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        Postman.writeToParcel(this, dest);
    }

    @Parceled
    public static class State extends A.State implements Parcelable {

        public static final Creator<State> CREATOR = Postman.getCreator(State.class);

        // Postman Fields

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

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            Postman.writeToParcel(this, dest);
        }
    }
}

As far as I can tell the State$$Parceler only handles its own fields, but the B$$Parceler seems to be setting the State field twice. Once I assume is for the A.State field and the other for the B.State field.

public final class B$State$$Parceler implements Parceler<B.State> {

  @Override
  public void writeToParcel(B.State object, Parcel dest) {
    Bundle bundle = new Bundle();
    bundle.putInt("mSomeCustomField", object.mSomeCustomField);
    dest.writeBundle(bundle);
  }

  @Override
  public B.State readFromParcel(Parcel parcel) {
    B.State object = new B.State();
    Bundle bundle = parcel.readBundle();
    bundle.setClassLoader(B.State.class.getClassLoader());
    object.mCurrentManaCost = bundle.getInt("mCurrentManaCost");
    return object;
  }

  @Override
  public B.State[] newArray(int size) {
    return new B.State[size];
  }

}

public final class B$$Parceler implements Parceler<B> {

  @Override
  public void writeToParcel(B object, Parcel dest) {
    Bundle bundle = new Bundle();
    bundle.putParcelable("mState", object.mState);
    bundle.putParcelable("mState", object.mState);
    dest.writeBundle(bundle);
  }

  @Override
  public Commander readFromParcel(Parcel parcel) {
    B object = new B();
    Bundle bundle = parcel.readBundle();
    bundle.setClassLoader(B.class.getClassLoader());
    object.mState = bundle.getParcelable("mState");
    object.mState = bundle.getParcelable("mState");
    return object;
  }

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

}

Can you explain how these parcelers handle class hierarchy and if this is a problem?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions