Android |在捆绑包中使用可打包数据时解组未知类型

Android |在捆绑包中使用可打包数据时解组未知类型,android,exception,unmarshalling,parcelable,Android,Exception,Unmarshalling,Parcelable,我在使用Android.Bundle通过两个活动发送ArrayList中的可包裹数据时遇到问题 我有两项活动(A和B) 在Aaaa.class中: ArrayList<Model> mModelList = new ArrayList<Model> //Fill ArrayList with a few Model-Objects Bundle mBundle = new Bundle; Intent mIntent = new Intent(Aaaa.this, Bb

我在使用Android.Bundle通过两个活动发送ArrayList中的可包裹数据时遇到问题

我有两项活动(A和B)

在Aaaa.class中:

ArrayList<Model> mModelList = new ArrayList<Model>
//Fill ArrayList with a few Model-Objects

Bundle mBundle = new Bundle;
Intent mIntent = new Intent(Aaaa.this, Bbbb.class);

mBundle.putParcelableArrayList("models", mModelList);
mIntent.putExtras(mBundle);

startActivity(mIntent);
第52行是

ArrayList<Model> = mBundle.getParcelableArrayList("models");
ArrayList=mBundle.getParcelableArrayList(“模型”);
我完全不知道这里的问题在哪里,Model.class与其他Bundle-intent一起工作得很好

更新:

模型类如下所示

public class Model implements Parceleble{

  private String name;
  private String address;

  public Model(Parcel parcel){
  }
  public Model(){
  }
  public Model(String name, String address){
    this.name = name;
    this.address = address;
  }

  //Getter and Setter

  //equals, HashCode, toString (autoGenerated from Idea)

  @Override
  public void writeToParcel(Parcel parcel, int i){
    parcel.writeString(name);
    parcel.writeString(address);
  }

  public void readFromParcel(Parcel parcel){
    this.name = parcel.readString();
    this.address = parcel.readString();
  }

  public static Parcelable.Creator<Model> CREATOR = new Parcelable.Creator<Model>(){
  @Override
  public Model createFromParcel(Parcel parcel){
    return new Model(parcel);
  }

  @Override
  public Model[] new Array(int size){
    return new Model[size]
  }
};
}
公共类模型实现了可包裹{
私有字符串名称;
私有字符串地址;
公共模型(地块){
}
公共模型(){
}
公共模型(字符串名称、字符串地址){
this.name=名称;
this.address=地址;
}
//接二连三
//equals、HashCode、toString(由Idea自动生成)
@凌驾
公共无效书面包裹(包裹,内部i){
包裹。书面记录(姓名);
包裹。书面记录(地址);
}
公共无效readFromParcel(地块){
this.name=parcel.readString();
this.address=parcel.readString();
}
public static Parcelable.Creator=新建Parcelable.Creator(){
@凌驾
公共模型createFromParcel(地块){
退回新型号(包裹);
}
@凌驾
公共模型[]新数组(整数大小){
返回新型号[尺寸]
}
};
}

您的Parcelable实现在我看来不太正确,请查看中的示例代码,查看需要重写的所需方法/构造函数:

... ...

// ==================== Parcelable ====================
public int describeContents() {
  return 0;
}

public void writeToParcel(Parcel parcel, int flags) {
  parcel.writeString(name);
  parcel.writeString(address);
}

private Model(Parcel in) {
  name = in.readString();
  address = in.readString();
}

public static final Parcelable.Creator<Model> CREATOR = new Parcelable.Creator<Model>() {
  public Model createFromParcel(Parcel in) {
    return new Model(in);
  }

  public Model[] newArray(int size) {
    return new Model[size];
  }
};

... ...
。。。
//===========================================可包裹====================
公共int描述内容(){
返回0;
}
公共无效writeToParcel(Parcel-Parcel,int标志){
包裹。书面记录(姓名);
包裹。书面记录(地址);
}
私人模型(地块内){
name=in.readString();
地址=in.readString();
}
public static final Parcelable.Creator=新建Parcelable.Creator(){
公共模型createFromParcel(地块中){
返回新模型(in);
}
公共模型[]新数组(整数大小){
返回新型号[尺寸];
}
};
... ...

试试这段代码,看看它是否有用。

我花了很长时间才发现这是什么,我认为这是一个bug让我解释一下:

如果你的模型有字符串字段,Android无法在方法上很好地恢复它们

Parcel.readString()
他试图转换字符串并给您一个未知类型,如未知字符。只要做一个测试,如果你使用一个没有字符串字段的可打包模型,它就可以完美地运行

我不知道该怎么做,为什么会出现字符串字段


为了解决这个问题,我想使用数据库将模型对象列表传递给下一个活动,也许这不是更好的主意,但我没有其他方法。

你可以发布模型类吗?@yorkw按照你的意愿发布模型类。你好@yorkw非常感谢你的回复。问题在于模型的实现,特别是在包创建者(私有模型(parcel-in))中。我看不出这段代码与OP提供的模型类代码有什么不同,或者它是后来更新的?@ChristianGarcía OP的实现缺少方法
describeContents
,该方法非常重要,因为它解释了包裹(其中的对象)的内容。我希望你现在明白了。
... ...

// ==================== Parcelable ====================
public int describeContents() {
  return 0;
}

public void writeToParcel(Parcel parcel, int flags) {
  parcel.writeString(name);
  parcel.writeString(address);
}

private Model(Parcel in) {
  name = in.readString();
  address = in.readString();
}

public static final Parcelable.Creator<Model> CREATOR = new Parcelable.Creator<Model>() {
  public Model createFromParcel(Parcel in) {
    return new Model(in);
  }

  public Model[] newArray(int size) {
    return new Model[size];
  }
};

... ...
Parcel.readString()