【问题标题】:NotSerializableException threw by ObjectInputStream.readObject()ObjectInputStream.readObject() 抛出的 NotSerializableException
【发布时间】:2015-07-14 03:46:10
【问题描述】:

我在使用Bundle 传递ArrayList<People>(包含大图片)而不是活动时遇到了一些问题。我失败了,因为Bundle 有 1MB 的限制。 通过一些研究,我发现序列化对象并将其保存到文件会更好,所以我制作了这个类:

public class BundlePeople {

    public static long packPeople(Context context, List<People> people) {
        long timeToken = System.currentTimeMillis();
        String fileName = "temp_" + Long.toString(timeToken);
        try {
            FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
            ObjectOutputStream os = new ObjectOutputStream(fos);
            os.writeObject(people);
            os.close();
            fos.close();
        } catch (IOException e) {
            Log.e("BundlePeople", e.getMessage());
        }

        return timeToken;
    }

    public static List<People> unpackPeople(Context context, long id) {
        List<People> list = new ArrayList<>();

        String fileName = "temp_" + Long.toString(id);
        try {
            FileInputStream fis = context.openFileInput(fileName);
            ObjectInputStream is = new ObjectInputStream(fis);
            list.addAll((List<People>) is.readObject()); //Here I get NotSerializableException on second call
            is.close();
            fis.close();
        } catch (IOException | ClassNotFoundException e) {
            Log.e("BundlePeople", e.getMessage());
        }

        return list;
    }
}

它可以工作一次,但是当我再次尝试使用它时,它会抛出NotSerializableExcpetion

第一次通话

传递(FirstActivity.java)

Bundle bundle = new Bundle();
bundle.putLong("peopleFileId", BundlePeople.packPeople(FirstActivity.this, listPeople));
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
i.putExtras(bundle);    
startActivityForResult(i.setFlags(SecondActivity.FLAG_SELECT), 0);

接收(SecondActivity.java)

long id = getIntent().getExtras().getLong("peopleFileId");
list = new ArrayList<>();
list.addAll(BundlePeople.unpackPeople(getApplicationContext(), id));

目前还可以,问题是我第二次使用的时候:

第二次通话

传递(SecondActivity.java)

Intent i = new Intent();
Bundle b = new Bundle();
b.putLong("peopleFileId", BundlePeople.packPeople(SecondActivity.this, list));
i.putExtras(b);
setResult(REQUEST_PEOPLE, i);
finish();

接收(FirstActivity.java [onActivityResult()])

List<People> list = BundlePeople.unpackPeople(
                        getApplicationContext(), data.getExtras().getLong("peopleFileId"));

这里我的列表是null,因为在第一个代码指示的行的BundlePeople 上引发了异常。

异常消息:Read an exception; java.io.NotSerializableException: br.com.something.activities.SecondActivity$1

我的问题是,为什么会出现这个异常?这是将大型对象传递给活动的更好方法吗?如果是,这里有什么问题?

编辑

People.java

public class People implements Serializable {

    private static final long serialVersionUID = -9171517741542003990L;

    private Integer id;
    private String name;
    private BitmapSerializable image;

    public BitmapSerializable getImage() {
        return image;
    }

    public void setImage(BitmapSerializable image) {
        this.image = image;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

【问题讨论】:

  • 你可以为 People 发布你的 bean 类吗?
  • @JayShah 检查已编辑的问题!
  • 您是否还制作了另一个类 BitmapSerializable?我认为您的一个类中有一些文件是不可序列化的,这会导致此问题。
  • 如果您的位图序列化有问题,请参考此链接:stackoverflow.com/questions/5871482/…
  • 我想不通。我在使用gson的时候也遇到过这种情况。但是这是gson数据能力问题。我的数据超过了它的限制,很长的集合。也许你的情况也有这种问题。

标签: java android file serialization


【解决方案1】:

你:

  • 序列化了一个不可序列化的对象;
  • 忽略异常;
  • 保留文件;和
  • 试图反序列化它。

幸运的是,Java 在这种情况下将异常写入文件并在您反序列化时将其抛出。异常消息为您提供相关类的名称。

但它不应该走到这一步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2013-01-03
    • 2016-10-26
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多