【发布时间】: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