我还没有理解如何为包含Parcelable
个对象的对象正确实现GregorianCalendar
所需的代码。
E.g。对于包含User
和String 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());
}
正确的方法是什么?
答案 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
和反之亦然。