如何为包含GregorianCalendar的对象创建Parcelable代码

时间:2014-10-11 14:45:36

标签: android parcelable parcel

我还没有理解如何为包含Parcelable个对象的对象正确实现GregorianCalendar所需的代码。

E.g。对于包含UserString name;的对象GregorianCalendar creationDate;,我的尝试是这样的:

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

@Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.name);
        dest.writeParcelable(this.creationDate, flags);
    }

    private User(Parcel in) {
        this.name = in.readString();
        this.creationDate = in.readParcelable(GregorianCalendar.class.getClassLoader());
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        public User createFromParcel(Parcel source) {
            return new User(source);
        }

        public User[] newArray(int size) {
            return new User[size];
        }
    };
不幸的是,

不起作用

在<{1}}的第

writeToParcel()

get writeParcelable无法应用于GregorianCalendar 错误

in

dest.writeParcelable(this.creationDate, flags);

获取不兼容的类型错误

如何正确编码this.creationDate = in.readParcelable(GregorianCalendar.class.getClassLoader());

修改

我尝试了一些代码生成器,但使用了不同的方法,我不确定什么是正确的实现,第一个以这种方式使用writeValue和readValue:

Parcelable

第二个使用

 @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeValue(creationDate);
    }

 protected User(Parcel in) {
        name = in.readString();
        creationDate = (GregorianCalendar) in.readValue(GregorianCalendar.class.getClassLoader());
    }

正确的方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以使用自GregorianCalendar实施Serializable以来的第二种方式,Parcelable将有效。

      @Override
      public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeSerializable(creationDate);
      }

     protected User(Parcel in) {
            name = in.readString();
            creationDate = (GregorianCalendar) in.readSerializable();
     }

然而你不能序列化GregorianCalendar ,因为GregorianCalendar相关类中的更新可能会导致问题。考虑加载包含使用不同API版本创建的GregorianCalendar个对象的文件的情况,GregorianCalendar实现中的差异将导致确定错误,serialVersionUID costant中的差异足够小阻止正确加载文件。

使用long参数存储日期的毫秒数,如果您不想重写整个应用程序,则可以轻松创建几种方法将毫秒转换为GregorianCalendar和反之亦然。