2016-10-31 12 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

関連する問題