2014-01-13 47 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_。 –

相关问题