使用Parceler库

时间:2016-05-23 18:14:34

标签: android gson parceler

我有一个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时,我将我的Parceled question对象传递给它(其中question已设置所有字段):

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

ShowQuestionActivity上,我得到" extra_question"来自我的intent对象:

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

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

使用Parcels.wrap(question)包装对象并在调试器上使用Parcels.unwrap(question)展开它可以完美地工作,但在通过意图后,它似乎失去了"它的价值观,但我无法找到问题......

我的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'
}

1 个答案:

答案 0 :(得分:2)

使用BEAN序列化策略,Parceler需要为要包装和解包的类中的每个属性匹配getter和setter。

此外,默认情况下未映射的属性(例如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编组内部类状态感到满意,您可能需要考虑使用默认的FIELD序列化策略,而不是BEAN与非私有字段配对。此技术不需要任何特定的getter和setter组合。