2014-01-13 93 views
-1

這是代碼的一部分,我認爲這個問題是相關的。NotSerializableException:不知道是什麼原因

//Enveloping class 
public class BackupSMS implements Serializable{ 

transient Cursor cursor; 
String vfile; 
transient Context mContext; 
private final String TAG = "BackupSMS"; 
SMSBackup smsBackup; 
transient FileOutputStream mFileOutputStream; 

public BackupSMS(Context context, String _vfile) { 
    mContext = context; 
    vfile = _vfile; 
    smsBackup = new SMSBackup(); 
} 

內部類:

public class SMSBackup implements Serializable{ 
public ArrayList<SMSObject> SMSList; 
public SMSBackup() { 
    SMSList = new ArrayList<SMSObject>(); 
} 
} 

public class SMSObject implements Serializable{ 
private String id; 
private String addr; 
private String msg; 
.... (more private strings and getter setter methods for them) 
} 

//method of enveloping class. 
public void writeSMSList(){ 
...... 
    mFileOutputStream = mContext.openFileOutput(vfile, Context.MODE_PRIVATE); 
    ObjectOutputStream oos = new ObjectOutputStream(mFileOutputStream); 
    //smsBackup is an object of SMSBackup class created earlier. 
oos.writeObject(smsBackup); 
oos.close(); 
....... 
} 

我似乎沒有找到圖片任何不可序列化對象。任何出現問題的建議都會有所幫助。

編輯:我沒有看足夠接近堆棧跟蹤。下面是我獲得的堆棧跟蹤,但它仍然沒有讓我更接近解決方案。有什麼建議麼?

java.io.NotSerializableException: android.content.ContentResolver$CursorWrapperInner 
    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364) 
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 
at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) 
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368) 
at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074) 
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) 
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 
at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) 
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368) 
at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074) 
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) 
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 

....還有更多這樣的線條。

+4

原因出現在消息中。它命名了一個不可序列化的類。沒有什麼不確定的。 – EJP

+0

讓有問題的類實現Seializable。 – Maroun

+0

@ᴍarounᴍaroun - 這只是解決方案的一部分.... –

回答

0

如果嵌套類中沒有直接引用它們包含的實例(例如,通過訪問非靜態字段或調用包含類的非靜態方法),那麼它們可能不需要是內部類在所有。如果您將類標記爲static,那麼它們將不會持有對容器實例的引用,因此不會嘗試序列化整個對象圖。

+0

那麼工作伊恩。非常感謝您指出這一點。我沒有意識到嵌套類持有對容器類的引用。 – pareshnakhe

+0

@pareshnakhe _inner_類做,_static嵌套_類不。 [本教程](http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)很好地解釋了這些差異。附:如果我的答案解決了您的問題,則應考慮使用左側的刻度標記將其標記爲_accepted_。 –

相關問題