parceler
parceler copied to clipboard
@ParcelPropertyConverter annotated property is not written to parcel using converter
I have a user model as shown below
import org.parceler.Parcel;
import org.parceler.ParcelConstructor;
import org.parceler.ParcelPropertyConverter;
import org.threeten.bp.OffsetDateTime;
@Parcel
public class User {
String firstName;
String lastName;
@ParcelPropertyConverter(OffsetDateTimeParcelConverter.class)
OffsetDateTime createdAt;
@ParcelConstructor
public User(String firstName, String lastName, OffsetDateTime createdAt) {
this.firstName = firstName;
this.lastName = lastName;
this.createdAt = createdAt;
}
}
with the createdAt
OffsetDateTime field annotated with a @ParcelPropertyConverter
, but the converter is not used when writing this field to a parcel.
This is the generated parcelable class i get
@Generated("org.parceler.ParcelAnnotationProcessor")
@SuppressWarnings({
"unchecked",
"deprecation"
})
public class User$$Parcelable
implements Parcelable, ParcelWrapper<com.edwinnyawoli.parcelerissuetest.User>
{
private com.edwinnyawoli.parcelerissuetest.User user$$0;
@SuppressWarnings("UnusedDeclaration")
public final static Creator<User$$Parcelable>CREATOR = new Creator<User$$Parcelable>() {
@Override
public User$$Parcelable createFromParcel(android.os.Parcel parcel$$2) {
return new User$$Parcelable(read(parcel$$2, new IdentityCollection()));
}
@Override
public User$$Parcelable[] newArray(int size) {
return new User$$Parcelable[size] ;
}
}
;
public User$$Parcelable(com.edwinnyawoli.parcelerissuetest.User user$$2) {
user$$0 = user$$2;
}
@Override
public void writeToParcel(android.os.Parcel parcel$$0, int flags) {
write(user$$0, parcel$$0, flags, new IdentityCollection());
}
public static void write(com.edwinnyawoli.parcelerissuetest.User user$$1, android.os.Parcel parcel$$1, int flags$$0, IdentityCollection identityMap$$0) {
int identity$$0 = identityMap$$0 .getKey(user$$1);
if (identity$$0 != -1) {
parcel$$1 .writeInt(identity$$0);
} else {
parcel$$1 .writeInt(identityMap$$0 .put(user$$1));
parcel$$1 .writeString(user$$1 .firstName);
parcel$$1 .writeString(user$$1 .lastName);
parcel$$1 .writeSerializable(user$$1 .createdAt);
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public com.edwinnyawoli.parcelerissuetest.User getParcel() {
return user$$0;
}
public static com.edwinnyawoli.parcelerissuetest.User read(android.os.Parcel parcel$$3, IdentityCollection identityMap$$1) {
int identity$$1 = parcel$$3 .readInt();
if (identityMap$$1 .containsKey(identity$$1)) {
if (identityMap$$1 .isReserved(identity$$1)) {
throw new ParcelerRuntimeException("An instance loop was detected whild building Parcelable and deseralization cannot continue. This error is most likely due to using @ParcelConstructor or @ParcelFactory.");
}
return identityMap$$1 .get(identity$$1);
} else {
com.edwinnyawoli.parcelerissuetest.User user$$4;
int reservation$$0 = identityMap$$1 .reserve();
java.lang.String string$$0 = parcel$$3 .readString();
java.lang.String string$$1 = parcel$$3 .readString();
org.threeten.bp.OffsetDateTime offsetDateTime$$0 = ((org.threeten.bp.OffsetDateTime) parcel$$3 .readSerializable());
user$$4 = new com.edwinnyawoli.parcelerissuetest.User(string$$0, string$$1, offsetDateTime$$0);
identityMap$$1 .put(reservation$$0, user$$4);
com.edwinnyawoli.parcelerissuetest.User user$$3 = user$$4;
identityMap$$1 .put(identity$$1, user$$3);
return user$$3;
}
}
}
This may be an oversight, trying to think of why this was implemented the way it is.
In the meantime you can move the converter to your constructor:
@Parcel
public class User {
String firstName;
String lastName;
OffsetDateTime createdAt;
@ParcelConstructor
public User(String firstName, String lastName, @ParcelPropertyConverter(OffsetDateTimeParcelConverter.class) OffsetDateTime createdAt) {
this.firstName = firstName;
this.lastName = lastName;
this.createdAt = createdAt;
}
}