2014-01-13 2 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(); 
....... 
} 

Я, кажется, не найти unserializable объект на картинке. Любые советы, как то, что происходит не так, помогут.

EDIT: Я не выглядел достаточно близко к трассе стека. Ниже получена трассировка стека, но она по-прежнему не приближает меня к решению. Какие-либо предложения?

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_ classes do, _static вложенные классы не делают. [Этот учебник] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) хорошо помогает объяснить различия. Постскриптум если мой ответ решит вашу проблему, вы должны рассмотреть ее как _принятую_, используя отметку слева. –

Смежные вопросы