Parceler scan gives invalid data

I use parceler to implement the Parcelable interface.

I have such a model

@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> {} } 

I wave my model and set it on target.

  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); 

And the deployment of activity

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

but sometimes the "createDate" field has the wrong value after expanding into activity.

I tried to register it and after deploying from the Bundle - this is normal, but in action - it has strange data.

Example:

unpack the node immediately after its creation

Ads {id = 16, title = 'Mtitle', description = 'Mads', adsType = BUY, phone =' + 30890931231 ', email =' + 380932309046 ', city =' Anabar National Ulus', creationDate = '[2015, 8, 8, 9, 27, 0, 350946000]}

unzip the activity.getExtra () object

Ads {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, 0,

I don’t know why, but it creates an array with parameter creationDate 1 and filling it with zeros.

+4
source share
2 answers

I noticed that when deploying a class

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

You tried it like this:

 mAdsDetails = Parcels.unwrap(this.getIntent().getExtras().get(ADS_DETAILS)); 
0
source

I believe this may be due to the discrepancy between the returned int type of the #getPrice function and the Long type of the price argument to the constructor annotated with @ParcelConstructor .

This will result in generated code that:

  • writes an integer to a packet for serialization
  • trying to read a complex, larger type when deserializing
  • deserialization continues, but efficiently reads garbage, as readFoo methods readFoo called with an "incorrect" buffer offset

In particular, when checking the code generated by Parceler and debugging the same problem in my code, I found that:

  • primitive types are written directly to the package as a single value
  • complex types (for example, wrappers for primitive types) are written with two values: one for null vs. non null as a flag, and then possibly the actual value if not null

See this problem I made for the Parceler project:

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

0
source

All Articles