2015-05-04 124 views
0

我有一些問題,通過傳遞ArrayList<People>(其中包含大圖片)通過活動。我失敗了,因爲Bundle有1MB的限制。 有了一些研究,我發現,這將是更好的序列化對象,並將其保存到一個文件中,所以我做了這個類:NotSerializableException拋出ObjectInputStream.readObject()

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; 
    } 
} 
+0

你可以發佈你的bean類的人嗎? –

+0

@JayShah檢查編輯的問題! – Rafael

+0

您是否還使BitmapSerializable成爲另一個類?我認爲您的某個類中存在一些不可序列化的問題。 –

回答

1

您:

  • 序列化的對象是不可序列;
  • 忽略異常;
  • 保存文件;和
  • 試圖從它反序列化。

幸運的是,Java在這種情況下將異常寫入文件,並在反序列化時拋出。異常消息給你相關類的名字。

但它應該永遠不會有這麼遠。

相關問題