1

我有一个 Java Bean 类,在某些字段上用@Parcel(Parcel.Serialization.BEAN)Gson注释:@SerializedName

问题.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);

ShowQuestionActivity,我从我的intent对象中得到“extra_question”:

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'
}
4

1 回答 1

2

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

此外,默认情况下未映射的属性,如Date,要求您编写转换器或将这些类型映射到 with @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 组合。

于 2016-05-25T22:19:50.223 回答