1

REST サーバーに接続する Android アプリを作成していますが、サーバーの応答をモデル化するクラスで次のエラーが発生します。

エラー:(16, 15) エラー: パーセラー: 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
}

この問題を解決する方法はありますか?

4

2 に答える 2

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。そうしないと、パーセルが実行時例外をスローします。

于 2015-07-16T04:19:26.097 に答える
0

ジェネリックをパーセルできないのは正しいです。(無制限のジェネリックをシリアライズすることもできません!)

ジェネリック クラスのインスタンスがある場合、そのインスタンスの型は実行時に消去されるため、具象型のみが存在します。実行時に、ジェネリック型パラメーターのすべてのインスタンスがその境界に置き換えられます。ここで使用するような無制限のパラメーターは、Object に置き換えられます。

あなたはできるかもしれません:

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

これにより、タイプが消去されたときに E が Parcelable に置き換えられます。Parceler ライブラリは、すべての Parcelable 型をサポートすると主張しています。Result の値パーセル可能であることを確認する必要がありますが、パーセルで送信するにはすでにそれが必要です。

于 2015-07-15T18:52:20.523 に答える