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