【问题标题】:NotSerializableException: Not sure what the reason isNotSerializableException:不知道是什么原因
【发布时间】:2014-01-13 08:21:27
【问题描述】:

这是我认为与此问题相关的部分代码。

//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)

....以及更多这样的行。

【问题讨论】:

  • 原因出现在消息中。它命名了一个不可序列化的类。没有什么可不确定的。
  • 让有问题的班级implements Seializable.
  • @ᴍarounᴍaroun - 这只是解决方案的一部分......
  • 你没有粘贴你得到的错误
  • "这些是其他类的内部类。" - 然后序列化它们也必须序列化它们的包含类的实例。包含类是否可序列化?

标签: java android serialization


【解决方案1】:

如果嵌套类中没有任何内容直接引用它们的包含实例(例如,通过访问非静态字段或调用包含类的非静态方法),那么它们可能不需要是内部类全部。如果您将类标记为static,那么它们将不会持有对容器实例的引用,因此不会尝试序列化整个对象图。

【讨论】:

  • 这很好,伊恩。非常感谢您指出这一点。我不知道嵌套类包含对容器类的引用。
  • @pareshnakhe inner 类可以,静态嵌套 类不可以。 This tutorial 很好地解释了这些差异。附言如果我的回答解决了您的问题,您应该考虑使用左侧的勾号将其标记为已接受
猜你喜欢
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 2017-04-10
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多