1

我正在构建一个连接到 REST 服务器的 Android 应用程序,并且在模拟服务器响应的类中出现此错误:

错误:(16, 15) 错误: Parceler: Unable to find read/write generator for type java.lang.Object for com.myapp.ServerResponse.result

我认为错误是因为我使用泛型 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
}

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

4

2 回答 2

2

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

@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否则 Parcels 将引发运行时异常。

于 2015-07-16T04:19:26.097 回答
0

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

当您有一个泛型类的实例时,该实例的类型在运行时被删除,因此只有具体类型。在运行时,泛型类型参数的所有实例都被其边界替换。像您在此处使用的无限参数被 Object 替换。

你也许可以这样做:

@Parcel
public class ServerResponse<E extends Parcelable> {
    @SerializedName("result")
    private E result;
}

当类型被擦除时,这将用 Parcelable 替换 E。Parceler 库声称支持任何 Parcelable 类型。您需要确保 Result 中的值是可包裹的,但您已经需要将其以包裹的形式发送。

于 2015-07-15T18:52:20.523 回答