2016-10-31 57 views
0

我有下面的類:Parcelable和盒裝類

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

如何包裹數據部件B?或者更好的是,如何包裝盒裝類型?如您所見,writeToParcel方法會丟失數據成員b以及受保護的c'tor。

+2

'BigDecimal'是'Serializable'。 'Parcel'具有'writeSerializable()'。 – CommonsWare

+0

確實。我忘了BigDecimal是Serializable。 – learner

回答

2

參見: 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?

來解決這個問題(在我看來)的一個好方法是創建類擴展BigDecimal和它實現Parcelable接口。

+0

我測試了你的解決方案,發現它比直接使用序列化更優雅,你有正確的答案。 – lionheart

+0

@lionheart很好。請爲解決方案投票。 – learner

+0

這是正確的方法。 'writeSerializable'在內部分配一個'ObjectOutputStream',並通過'writeByteArray'將序列化結果放到Parcel中,所以你可以直接將一個對象轉換爲字節數組。 – user1643723