Java Parceler问题

时间:2015-07-15 17:46:28

标签: java android parcelable parceler

我正在构建一个连接到REST服务器的Android应用程序,我在课堂上收到了这个模型服务器响应的错误:

错误:(16,15)错误:Parceler:无法为com.myapp.ServerResponse.result找到类型java.lang.Object的读/写生成器

我认为错误是因为我使用泛型类型E. ServerResponse.java是:

public class ServerResponse <E> {
    @SerializedName("status")
    private int status;

    @SerializedName("result")
    private E result;

    @SerializedName("message")
    private String message;

    //Getters and setters
}

有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

Parceler在这种情况下选择速度,因此默认情况下它不会使用Parcels.wrap / unwrap(),但如果您想要处理泛型,可以使用@ParcelPropertyConveter它使用Parcels.wrap() / unwrap()方法:

@Parcel
public class ServerResponse <E> {

    @ParcelPropertyConverter(ParcelsWrapperConverter.class)
    private E result;
}

public class ParcelsWrapperConverter extends NullableParcelConverter<Object> {

    @Override
    public void nullSafeToParcel(Object input, android.os.Parcel parcel) {
        parcel.writeParcelable(Parcels.wrap(input), 0);
    }

    @Override
    public Object nullSafeFromParcel(android.os.Parcel parcel) {
        return Parcels.unwrap(parcel.readParcelable(ParcelsWrapperConverter.class.getClassLoader()));
    }
}

请确保您在ServerResponse中使用的值使用@Parcel进行注释,否则Parcel将抛出运行时异常。

答案 1 :(得分:0)

你是对的,你不能包裹仿制药。 (你也不能序列化无界的泛型!)

当你有一个泛型类的实例时,该实例的类型在运行时被擦除,因此只有具体的类型。在运行时,泛型类型参数的所有实例都由其边界替换。你在这里使用的无界参数被Object替换。

您可以这样做:

reset()

当擦除类型时,这将用Parcelable替换E. Parceler库声称支持任何Parcelable类型。您需要确保Result 中的值是parcelable,但您已经需要将其发送到Parcel中。