2016-05-23 6 views
1

ich eine Java Bean-Klasse haben, kommentierte mit @Parcel(Parcel.Serialization.BEAN) und Gson der @SerializedName auf einigen Feldern:Fehlende Felder, wenn ein Parcel Objekt mit Parceler Bibliothek Abwickeln

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

Wenn ich m beginnend ShowQuestionActivity übergebe ich mein Parceled question Objekt an es (question hat alle Felder eingestellt):

Intent intent = new Intent(context, ShowQuestionActivity.class); 
intent.putExtra("extra_question", Parcels.wrap(question)); 
startActivity(intent); 

Auf ShowQuestionActivity, erhalte ich "extra_question" von meinem intent Objekt:

Question question = Parcels.unwrap(intent.getParcelableExtra(Constants.EXTRA_QUESTION)); 

Aber Parceler gibt mir nur Titel und eine Beschreibung (Strings) ... Alle anderen Felder sind null.

Wrapping das Objekt mit Parcels.wrap(question) und es mit Parcels.unwrap(question) Abwickeln auf Debugger perfekt funktioniert, aber nachdem es durch Absicht vorbei, so scheint es zu „verlieren“ ihre Werte, aber ich kann nicht das Problem finden ...


Meine Parceler Einrichtung ist folgende:

Modul build.gradle:

dependencies { 
    compile 'org.parceler:parceler-api:1.1.4' 
    apt 'org.parceler:parceler:1.1.4' 
} 

Und in meinem Projekt build.gradle:

dependencies { 
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 
} 
+0

Ihr Setup sieht korrekt aus. Sind alle Getter/Setter korrekt deklariert? Ist der Benutzer mit '@ Parcel' versehen und haben Sie einen '@ ParcelPropertyConverter' für Date hinzugefügt? –

+0

@JohnEricksen, meine Getter und Setter sind ordnungsgemäß deklariert. Der Benutzer wird mit '@Parcel (Parcel.Serialization.BEAN)' mit Getter und Setter versehen und ich habe '@ ParcelPropertyConverter' noch nicht für Date hinzugefügt, da ich dieses Feld vorerst nicht benutzen werde. Stört Parceler das Erzeugen von Paketklassen? –

+0

Ich versuchte herauszufinden, was los war, und als ich @ @ ParcelProperty ("Gson @SerializedName field") hinzugefügt hatte, funktionierte es wie erwartet, aber es warnte mich vor Reflektion. Muss ich wirklich @ParcelProperty für jedes Feld schreiben? Und was ist mit Reflexion? –

Antwort

2

Mit der BEAN Serialisierung Strategie, Parceler erfordern für jede Eigenschaft in der Klasse Getter und Setter passend, die Sie wollen verpackten und unverpackten werden.

Außerdem müssen Eigenschaften, die nicht standardmäßig zugeordnet sind, wie Date, einen Konverter schreiben oder diese Typen mit @ParcelClass zuordnen. Siehe http://parceler.org/#custom_serialization

Hier ist ein Codebeispiel:

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

Bemerkenswert, wenn Sie zufrieden sind mit Gson internen Klassenstaat Rangier-, Sie können mit der Verwendung der Standard FIELD Serialisierung Strategie statt BEAN gepaart zu berücksichtigen nicht private Felder. Diese Technik erfordert keine spezielle Getter- und Setter-Kombination.

+0

Wow! Danke, dass du das notiert hast. Ich wusste nicht, dass ich die Getter und Setter manuell implementieren musste. Scheint im Nachhinein auf die Bibliothek. Warum konnte die generierte Klasse das nicht handhaben? – w3bshark

+0

Dies ist nur beim BEAN-Sealization-Typ. Mit dem Standard-Feldtyp werden die Felder direkt verwendet und vermeiden die Notwendigkeit von Getter/Setter. –

+0

Ja, verstanden. Ich verwende Realm mit Parceler für einige meiner Objekte und nur diese Objekte erfordern die BEAN-Serialisierung, also habe ich nur diese aktualisiert. Danke für die Hilfe. Sehr geschätzt! – w3bshark

Verwandte Themen