【发布时间】:2015-08-28 04:01:39
【问题描述】:
我正在从 Asynctask + Loader 迁移到 Retrofit,用于我们的核心网络。在我遇到以前没有发生的 ClassCastExceptions 之前一切顺利:
ImagePojo imagePojo = (ImagePojo) mediaPojo; // Error: cannot cast MediaPojo to ImagePojo
这是我的 POJO 在层次结构中的骨架:
父/通用媒体对象
public class MediaPojo extends CustomObservable implements Parcelable {
@SerializedName("media_id")
private String mMid;
@SerializedName("type")
private String mType;
@SerializedName("title")
public MediaPojo() {
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mNid);
dest.writeString(mType);
dest.writeString(mTitle);
}
public static final Parcelable.Creator<MediaPojo> CREATOR = new Parcelable.Creator<MediaPojo>() {
@Override
public MediaPojo createFromParcel(Parcel source) {
return new MediaPojo(source);
}
@Override
public MediaPojo[] newArray(int size) {
return new MediaPojo[size];
}
};
...
}
// 定义所有媒体类型共有的字段
视频媒体类型
public class VideoPojo extends MediaPojo implements Parcelable {
@SerializedName("video_id")
private String mVid;
@SerializedName("video_url")
private String mVideoUrl;
@SerializedName("thumbnail")
private String mThumbnail ...
}
图像媒体类型 POJO
public class ImagePojo extends MediaPojo implements Parcelable {
@SerializedName("image_url")
private String mImageUrl;
@SerializedName("width")
private String mImageWidth;
@SerializedName("height")
private String mImageHeight
...
}
// 其他类型:TextPojo、InfoGraphicPojo ...
到目前为止,我在迁移中对 POJO 所做的唯一更改是添加 @SerializedName 注释以允许 Retrofit 自动将 JSON 字段映射到定义的 POJO 实例变量。我发现有必要在运行时对特定类型的 POJO 进行通用 MediaPojo 转换,因为我对 api.mydomain.com/media 的 REST 调用可以返回表示各种类型(视频、图像等)媒体的 JSON。
有什么方法可以让 Retrofit 围绕我已经存在的对象继承结构工作?或者它可以像我使用 Parcelable 接口进行序列化的方式一样吗?
【问题讨论】: