【问题标题】:Read or Write from/to Parcel for an object which can not implement Parcelable从/向 Parcel 读取或写入无法实现 Parcelable 的对象
【发布时间】:2015-07-07 10:33:36
【问题描述】:

我有一个像 ObjectA 这样实现 Parcelable 的类。

public class ObjectA implements Parcelable {

       private ObjectB objB;
       private int mId;

}

ObjectB 来自添加到项目的 .jar 文件,我无法为该类实现 Parcelable 接口。

private ObjectA(Parcel in) {

}

@Override
public void writeToParcel(Parcel dest, int flags) {

}

所以我想知道是否有任何解决方案可以从 Parcel 读取或写入 Parcel for ObjectB?

当然dest.writeParcelablein.readParcelable 将不起作用,因为ObjectB 无法实现Parcelable 接口。

【问题讨论】:

  • 您可以通过 getter 从 ObjectB 获取属性并将其写入 Parcel,当您从 Parcel 读取时 - 您可以创建新的 ObjectB 并通过 setter 设置它。如果您没有访问权限和任何 setter/getter,则可以使用反射。
  • 您可以分享您的答案,我将其标记为已接受@Konrad。

标签: android parcelable


【解决方案1】:

您可以通过 getter 从ObjectB 获取属性并将其写入Parcel,当您从Parcel 读取时 - 您可以创建新的ObjectB 并通过setter 设置它。如果您没有访问权限和任何 setter/getter,则可以使用反射。

【讨论】:

    【解决方案2】:

    应该可以通过对 ObjectB 使用处理对象来实现:

    public class ObjectBHandler implements Parcelable {
    
    private ObjectB b;
    
    
    public ObjectBHandler(ObjectB b) {
        this.b = b;
    }
    
    public ObjectB getB() {
        return b;
    }
    
    public void setB(ObjectB b) {
        this.b = b;
    }
    
    /**
     * Describe the kinds of special objects contained in this Parcelable's
     * marshalled representation.
     *
     * @return a bitmask indicating the set of special object types marshalled
     * by the Parcelable.
     */
    @Override
    public int describeContents() {
        return 0;
    }
    
    /**
     * Flatten this object in to a Parcel.
     *
     * @param dest  The Parcel in which the object should be written.
     * @param flags Additional flags about how the object should be written.
     *              May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeDouble(b.getValue());
        //...
    }
    

    }

    【讨论】:

      【解决方案3】:

      如果你的意思是你不能实现接口,因为它在一个罐子里,那么可能有一个解决方案: 如果你足够了解 ObjectB 的实现并且你知道应该恢复的每个字段,并且如果 ObjectB 不是最终的,我想你仍然可以这样做:

      public class ParcelableObjectB extends ObjectB implements Parcelable {...}
      

      【讨论】:

        猜你喜欢
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-06
        • 1970-01-01
        • 2014-01-27
        • 2021-08-11
        • 1970-01-01
        相关资源
        最近更新 更多