使用 Parceler 库展开 Parcel object 时缺少字段

Missing fields when unwrapping a Parcel object with Parceler library

我有一个 Java Bean class,在某些字段上用 @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 时,我将我的 Parceled question object 传递给它(其中 question 设置了所有字段):

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

ShowQuestionActivity,我从 intent object:

得到 "extra_question"
Question question = Parcels.unwrap(intent.getParcelableExtra(Constants.EXTRA_QUESTION));

但是 Parceler returns 我只有标题和描述(字符串)...所有其他字段都是 null

在调试器上用 Parcels.wrap(question) 包装 object 并用 Parcels.unwrap(question) 展开它工作得很好,但在通过意图传递它之后,它似乎 "lose" 它的值,但是我找不到问题...


我的 Parceler 设置如下:

模块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'
}

使用 BEAN 序列化策略,Parceler 需要匹配 getter 并为 class 中每个要包装和解包的 属性 设置器。

此外,默认情况下未映射的属性(如 Date)需要您编写转换器或将这些类型映射到 @ParcelClass。参见 http://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 编组内部 class 状态感到满意,您可能需要考虑使用默认的 FIELD 序列化策略而不是 BEAN 与非-私人领域。此技术不需要任何特定的 getter 和设置器组合。