4

我正在使用parceler库来实现 Parcelable 接口。

我有这样的模型

@Parcel(Parcel.Serialization.BEAN)
public class Ads {
private Long id;
private String title;
private String description;
private AdsType adsType;
private String phone;
private String email;
private String city;
private Long categoryId;
private ArrayList<Integer> creationDate;
//TODO remove transient
private transient ArrayList<Long> imageIds;
private transient Long price;


@SerializedName("adsCategory")
private AdvCategory advCategory;

public Ads() {}

public Ads(String title, String description, AdsType adsType, String
        phone, String email, String city, Long categoryId, Long price, ArrayList<Long> imageIds) {
    this.title = title;
    this.description = description;
    this.adsType = adsType;
    this.phone = phone;
    this.email = email;
    this.city = city;
    this.categoryId = categoryId;
    this.price = price;
    this.imageIds = imageIds;
}

@ParcelConstructor
public Ads(Long id, String title, String description, AdsType adsType,
           String phone, String email, String city, ArrayList<Long>
                   imageIds, Long price, ArrayList<Integer> creationDate, AdvCategory advCategory) {
    this.id = id;
    this.title = title;
    this.description = description;
    this.adsType = adsType;
    this.phone = phone;
    this.email = email;
    this.city = city;
    this.imageIds = imageIds;
    this.price = price;
    this.creationDate = creationDate;
    this.advCategory = advCategory;
}

public Long getId() {
    return id;
}

public String getTitle() {
    return title;
}

public String getDescription() {
    return description;
}

public AdsType getAdsType() {
    return adsType;
}

public String getPhone() {
    return phone;
}

public String getEmail() {
    return email;
}

public String getCity() {
    return city;
}

public AdvCategory getAdvCategory() {
    return advCategory;
}

public void setAdvCategory(AdvCategory advCategory) {
    this.advCategory = advCategory;
}

public Long getCategoryId() {
    return categoryId;
}

public ArrayList<Long> getImageIds() {
    return imageIds;
}

public void setImageIds(ArrayList<Long> imageIds) {
    this.imageIds = imageIds;
}

public int getPrice() {
    //TODO replace with real price
    return new Random().nextInt(100000);
}

public void setPrice(Long price) {
    this.price = price;
}

public ArrayList<Integer> getCreationDate() {
    return creationDate;
}

public void setCreationDate(ArrayList<Integer> creationDate) {
    this.creationDate = creationDate;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Ads ads = (Ads) o;
    return id.equals(ads.id);
}

@Override
public int hashCode() {
    int result = id.hashCode();
    result = 31 * result + title.hashCode();
    result = 31 * result + description.hashCode();
    result = 31 * result + adsType.hashCode();
    result = 31 * result + (phone != null ? phone.hashCode() : 0);
    result = 31 * result + (email != null ? email.hashCode() : 0);
    result = 31 * result + (city != null ? city.hashCode() : 0);
    result = 31 * result + advCategory.hashCode();
    result = 31 * result + (categoryId != null ? categoryId.hashCode() : 0);
    return result;
}

@Override
public String toString() {
    return "Ads{" +
            "id=" + id +
            ", title='" + title + '\'' +
            ", description='" + description + '\'' +
            ", adsType=" + adsType +
            ", phone='" + phone + '\'' +
            ", email='" + email + '\'' +
            ", city='" + city + '\'' +
            ", creationDate='" + creationDate.toString() +
            '}';
}

public static class List extends ArrayList<Ads> {}
}

我正在包装我的模型并将其放入意图中。

 Intent adsDetailsIntent = new Intent(this, AdsDetailsActivity.class);
    Bundle details = new Bundle();
    Ads advertisement = mAdsAdapter.getItem(position);
    details.putParcelable(AdsDetailsActivity.ADS_DETAILS, Parcels.wrap(advertisement));
    Ads ads = Parcels.unwrap(details.getParcelable(AdsDetailsActivity.ADS_DETAILS));
    Log.d("ads", ads.toString());
    adsDetailsIntent.putExtras(details);
    startActivity(adsDetailsIntent);

并在活动中展开

mAdsDetails = Parcels.unwrap(
            (Parcelable) this.getIntent().getParcelableExtra(ADS_DETAILS));

但有时在活动中展开后字段“creationDate”的值错误。

我试图记录它,在从 Bundle 解包之后 - 没关系,但在活动中 - 它有奇怪的数据。

例子 :

创建后立即从捆绑包中解包

广告{id=16, title='Mtitle', description='Mads', adsType=BUY, phone='+30890931231', email='+380932309046', city='Анабарский национальный улус', creationDate='[2015, 8、8、9、27、0、350946000]}

从活动 intent.getExtra() 中解包

广告{id=null, title='null', description='null', adsType=null, phone='null', email='null', city='null', creationDate='[8, 8, 9, 27, 0, 350946000, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

我不知道为什么,但它正在创建一个大小为 creationDate 1的数组并用零填充它。

4

2 回答 2

0

我注意到在您打开课程时

mAdsDetails = Parcels.unwrap(
            (Parcelable) this.getIntent().getParcelableExtra(ADS_DETAILS));

你有没有试过这样:

mAdsDetails = Parcels.unwrap(this.getIntent().getExtras().get(ADS_DETAILS));
于 2015-08-08T12:58:10.943 回答
0

我相信这可能与函数的返回int类型和用 .注释的构造函数的参数类型之间的差异有关。#getPriceLongprice@ParcelConstructor

这将导致生成的代码:

  1. 将整数写入包中以进行序列化
  2. 尝试在反序列化时读取复杂的、更大的类型
  3. 反序列化继续,但有效地读取垃圾,因为readFoo方法是用缓冲区中的“错误”偏移量调用的

具体来说,在检查 Parceler 生成的代码并在我的代码中调试相同的问题时,我发现:

  • 原始类型作为单个值直接写入包中
  • 复杂类型(如原始类型的包装器)用两个值编写:一个用于nullvs. non-null作为标志,如果不是,则可能是实际值null

请参阅我为 Parceler 项目制作的这个问题:

https://github.com/johncarl81/parceler/issues/234

于 2016-09-01T16:17:26.960 回答