3

我有一个名为Shop的类,它有2 个字段和 1 个静态字段。该类实现Parcelable接口:

public class Shop implements Parcelable{
   private static int SHOP_ID = 12;

   private String name;
   private long fund;

   //constructor with parcel
   public Shop(Parcel parcel){
       name = parcel.readString();
       fund = parcel.readLong();
   }

   //normal constructor
   public Shop(Owner owner){
        name = owner.getShopName();
        fund = owner.getFund();
    }

    @Override
  public int describeContents() {
    return 0;
  }

  @Override
  public void writeToParcel(Parcel dest, int flags) {
      dest.writeString(name);
      dest.writeLong(fund);
    }

    public static final Creator<Shop> CREATOR = new Creator<Shop>(){

       @Override
       public Shop createFromParcel(Parcel parcel) {
        //use the constructor which accept parcel
        return new Shop(parcel);
       }

       @Override
       public Shop[] newArray(int size) {
        return new Shop[size];
       }

    };
}

现在,我的代码使用普通的构造函数启动了一个Shop实例:

Owner owner = getOwnerInfo();
Shop myShop = new Shop(owner); //initiate a Shop with owner

然后,我的代码将shop实例存储到 Android 的内部存储中:

String fileName = "shop_file";
try{
  FileOutputStream fos = activity.openFileOutput(fileName,Context.MODE_PRIVATE);
  ObjectOutputStream oos = new ObjectOutputStream(fos);         

  oos.writeObject(myShop); 
  oos.flush();
  oos.close();
}catch(Exception ex){
  ...
}

但是当运行我的应用程序时,我得到了java.io.NotSerializableException

06-12 13:04:29.258: W/System.err(2632): java.io.NotSerializableException: com.my.app.model.Shop
06-12 13:04:29.258: W/System.err(2632):     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
06-12 13:04:29.266: W/System.err(2632):     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
06-12 13:04:29.266: W/System.err(2632):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)

为什么?我哪里错了?

4

2 回答 2

3

从 execption 看来,您正在尝试序列化未实现的 CartData 实例Serializable

java.io.NotSerializableException: com.my.app.model.Shop

如果你想序列化它,你应该让Shop implemensts Serializable

文档

Parcel 不是通用的序列化机制。此类(以及用于将任意对象放入 Parcel 的相应 Parcelable API)被设计为高性能 IPC 传输。因此,将任何 Parcel 数据放入持久存储是不合适的:Parcel 中任何数据的底层实现的更改都可能导致旧数据不可读。

于 2013-06-12T10:29:50.833 回答
0

我认为问题出在您的“所有者”对象上,该对象也没有序列化。尝试用 Parcelable 序列化这个对象

于 2013-06-12T10:47:51.623 回答