2016-10-31 6 views
0

Ich habe die folgende Klasse bekam:Parcel und geboxt Klassen

public class E implements Parcelable { 
    @SerializedName("a") 
    private String a= null; 
    @SerializedName("b") 
    private BigDecimal b= null; 
    @SerializedName("c") 
    private String c= null; 
    @SerializedName("d") 
    private String d= null;  

    protected E(Parcel in) { 
    number = in.readString(); 
    expirationYear = in.readString(); 
    expirationMonth = in.readString(); 
    } 

public static final Creator<E> CREATOR = new Creator<E>() { 
@Override 
public E createFromParcel(Parcel in) { 
    return new E(in); 
} 

    @Override 
    public E[] newArray(int size) { 
     return new E[size]; 
    }}; 
} 
    @Override 
    public int describeContents() { 
    return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(number); 
    dest.writeString(expirationYear); 
    dest.writeString(expirationMonth); 
    } 
} 

Wie das Datenelement b Paket? Oder noch besser, wie verpackte Typen verpacken?

Wie Sie sehen können, verfehlt die writeToParcel-Methode sowohl das Datenelement b als auch das geschützte c'tor.

+2

'BigDecimal' ist' Serializable'. 'Parcel' hat' writeSerializable() '. – CommonsWare

+0

In der Tat. Ich habe vergessen BigDecimal ist serialisierbar. – learner

Antwort

2

See: https://medium.com/the-wtf-files/the-mysterious-case-of-the-bundle-and-the-map-7b15279a794e#.sjbki9dss

How to use Parcelable on non-primitive types?

Ein guter Weg, um dieses Problem (meiner Meinung nach) zu lösen, ist die Klasse erstellen BigDecimal erstreckt und implementiert Parcel Schnittstelle auf sich.

+0

Ich habe Ihre Lösung getestet und empfand sie eleganter als direkt mit serializable, da haben Sie die richtige Antwort. – lionheart

+0

@lionheart Sehr gut. Bitte stimmen Sie für die Lösung ab. – learner

+0

Dies ist der richtige Ansatz. 'writeSerializable' weist intern einen' ObjectOutputStream' zu und platziert das Serialisierungsergebnis über 'writeByteArray' in Parcel, so dass Sie ein Objekt auch direkt in ein Byte-Array konvertieren können. – user1643723