使用 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 和设置器组合。
我有一个 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:
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 和设置器组合。