我必须将一个活动传递给另一个活动:
我有SalesProduct enetity类:
public class Product implements Parcelable{
private double availableQuantity;
private double price;
private String productCode;
private String description;
private String description2;
private String productGroup;
private String alternateSearch;
private String productTypeCode;
private String nonStockItemFlag;
private String salableFlag;
private double weight;
private double qty;
private double grossValue;
private double value;
private ArrayList<Product> product;
public Product() {
}
public Product(Parcel in) {
this();
readFromParcel(in);
}
/*
* Constructor calls read to create object
*/
private void readFromParcel(Parcel in) {
in.readTypedList(product, Product.CREATOR); …Run Code Online (Sandbox Code Playgroud) 似乎Parcelable没有优雅地处理像Serializable那样的循环引用.在下面的示例中,Bar的序列化工作正常,但将其写入Parcel会导致堆栈溢出:
I/TestRunner( 1571): java.lang.StackOverflowError
I/TestRunner( 1571): at android.os.Parcel.writeParcelable(Parcel.java:1106)
I/TestRunner( 1571): at android.os.Parcel.writeValue(Parcel.java:1029)
I/TestRunner( 1571): at com.XXX.util.ParcelableTest$Bar.writeToParcel(ParcelableTest.java:209)
I/TestRunner( 1571): at android.os.Parcel.writeParcelable(Parcel.java:1106)
I/TestRunner( 1571): at android.os.Parcel.writeValue(Parcel.java:1029)
I/TestRunner( 1571): at com.XXX.util.ParcelableTest$Baz.writeToParcel(ParcelableTest.java:246)
I/TestRunner( 1571): at android.os.Parcel.writeParcelable(Parcel.java:1106)
I/TestRunner( 1571): at android.os.Parcel.writeValue(Parcel.java:1029)
I/TestRunner( 1571): at com.XXX.util.ParcelableTest$Bar.writeToParcel(ParcelableTest.java:209)
I/TestRunner( 1571): at android.os.Parcel.writeParcelable(Parcel.java:1106)
I/TestRunner( 1571): at android.os.Parcel.writeValue(Parcel.java:1029)
public void testCircular() throws Exception {
final Bar bar = new Bar();
final Baz baz = new Baz(bar);
bar.baz = baz;
// First, serialize
final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
new ObjectOutputStream(bytes).writeObject(bar); …Run Code Online (Sandbox Code Playgroud) 我正在实现具有另一个Parcelable insde的Parcelable类.
在OuterParcelable类中:
@Override
public void writeToParcel(Parcel dest, int flags) {
Bundle tmp = new Bundle();
tmp.putParcelable("innerParcelable", mParcelable);
dest.writeBundle(tmp);
Run Code Online (Sandbox Code Playgroud)
然后:
public OuterParcelable(Parcel parcel) {
super();
Bundle b = parcel.readBundle();
mParcelable = b.getParcelable("innerParcelable");
Run Code Online (Sandbox Code Playgroud)
和:
public OuterParcelable createFromParcel(Parcel in) {
return new OuterParcelable(in);
}
Run Code Online (Sandbox Code Playgroud)
当我使用上面的代码重新创建对象时,我得到:
08-18 17:13:08.566: ERROR/AndroidRuntime(15520): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: my.package.InnerParcelable
Run Code Online (Sandbox Code Playgroud) android bundle unmarshalling parcelable classnotfoundexception