1

私はJava Beanクラスを持っており、いくつかのフィールドに@Parcel(Parcel.Serialization.BEAN)Gsonの注釈が付けられ@SerializedNameています:

Question.java:

@Parcel(Parcel.Serialization.BEAN)
public class Question {

    private Integer id;
    private String title;
    private String description;
    private User user;

    @SerializedName("other_model_id")
    private Integer otherModelId,

    @SerializedName("created_at")
    private Date createdAt;

    // ----- Getters and setters -----
}

を開始するときにShowQuestionActivity、Parceledquestionオブジェクトをそれに渡します (questionすべてのフィールドが設定されています)。

Intent intent = new Intent(context, ShowQuestionActivity.class);
intent.putExtra("extra_question", Parcels.wrap(question));
startActivity(intent);

で、オブジェクトから「 extra_question ShowQuestionActivity」を取得します。intent

Question question = Parcels.unwrap(intent.getParcelableExtra(Constants.EXTRA_QUESTION));

しかし、Parceler はタイトルと説明 (文字列) のみを返します... 他のすべてのフィールドはnullです。

デバッガーでオブジェクトをラップしParcels.wrap(question)てアンラップするとParcels.unwrap(question)完全に機能しますが、インテントを通過した後、その値を「失う」ように見えますが、問題が見つかりません...


私のパーセラーのセットアップは次のとおりです。

モジュールbuild.gradle :

dependencies {
    compile 'org.parceler:parceler-api:1.1.4'
    apt 'org.parceler:parceler:1.1.4'
}

そして、私のプロジェクトのbuild.gradleで:

dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
4

1 に答える 1

2

シリアル化戦略ではBEAN、Parceler は、ラップおよびラップ解除するクラス内の各プロパティに対してゲッターとセッターを一致させる必要があります。

さらに、 などDateのデフォルトでマップされないプロパティでは、コンバーターを記述するか、これらの型を でマップする必要があります@ParcelClasshttp://parceler.org/#custom_serializationを参照してください

コード例を次に示します。

@Parcel(Parcel.Serialization.BEAN)
public class Question {

    private Integer id;
    private String title;
    private Date createdAt;

    // id is included in the Parcelable because it has matching getter and setters
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }

    // title is not included as the setter is missing (it's not a true bean property)
    public String getTitle() { return title; }

    // createdAt will issue an error as it is not a defined type, and no converter is defined.
    public Date getCreatedAt() { return createdAt; }
    public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; }   
}

Gson が内部クラスの状態をマーシャリングすることに満足している場合は、非プライベート フィールドとペアにするFIELD代わりに、デフォルトのシリアル化戦略を使用することを検討することをお勧めします。BEANこの手法では、特定のゲッターとセッターの組み合わせは必要ありません。

于 2016-05-25T22:19:50.223 に答える