【问题标题】:Restoring an ArrayAdapter through deserialization?通过反序列化恢复 ArrayAdapter?
【发布时间】:2013-11-11 14:42:20
【问题描述】:

我正在尝试对实现 Serializable 的自定义 ArrayAdapter 进行序列化和反序列化。序列化似乎有效,但反序列化在下面标记为“**”的行上给了我一个 IllegalAccessException:

序列化:

FileOutputStream fos = this.openFileOutput ( fileName, Context.MODE_PRIVATE );
ObjectOutputStream os = new ObjectOutputStream ( fos );
os.writeObject ( adapter );
os.close ();

反序列化:

protected SerializableArrayAdapter createAdapter () {

    String fileName = "testFile";
    try {
        FileInputStream fis = this.openFileInput ( fileName );
        ObjectInputStream ois = new ObjectInputStream ( fis );
        **SerializableArrayAdapter adapter = ( SerializableArrayAdapter ) ois.readObject ();**
        ois.close ();
        return adapter;
    } catch ( Exception ex ) {
        ex.printStackTrace ();
    }

    adapter = new SerializableArrayAdapter ( this, android.R.layout.simple_list_item_1 );
    return adapter;
}

我做错了什么? (我是 java 和 android 新手)

编辑:添加了 logcat。呃,也许有办法让它不那么……乱七八糟?

10-31 16:13:49.960: W/System.err(28966): java.io.InvalidClassException: android.widget.ArrayAdapter; IllegalAccessException
10-31 16:13:49.960: W/System.err(28966):    at java.io.ObjectStreamClass.resolveConstructorClass(ObjectStreamClass.java:692)
10-31 16:13:49.960: W/System.err(28966):    at java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:653)
10-31 16:13:49.960: W/System.err(28966):    at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1819)
10-31 16:13:49.960: W/System.err(28966):    at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
10-31 16:13:49.960: W/System.err(28966):    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006)
10-31 16:13:49.968: W/System.err(28966):    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1963)
10-31 16:13:49.968: W/System.err(28966):    at com.example.tm2.MainActivity.createAdapter(MainActivity.java:41)
10-31 16:13:49.968: W/System.err(28966):    at com.example.tm2.MainActivity.onCreate(MainActivity.java:29)
10-31 16:13:49.968: W/System.err(28966):    at android.app.Activity.performCreate(Activity.java:5133)
10-31 16:13:49.968: W/System.err(28966):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-31 16:13:49.968: W/System.err(28966):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
10-31 16:13:49.968: W/System.err(28966):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-31 16:13:49.968: W/System.err(28966):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-31 16:13:49.968: W/System.err(28966):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-31 16:13:49.968: W/System.err(28966):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-31 16:13:49.968: W/System.err(28966):    at android.os.Looper.loop(Looper.java:137)
10-31 16:13:49.968: W/System.err(28966):    at android.app.ActivityThread.main(ActivityThread.java:5103)
10-31 16:13:49.968: W/System.err(28966):    at java.lang.reflect.Method.invokeNative(Native Method)
10-31 16:13:49.968: W/System.err(28966):    at java.lang.reflect.Method.invoke(Method.java:525)
10-31 16:13:49.968: W/System.err(28966):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-31 16:13:49.968: W/System.err(28966):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-31 16:13:49.968: W/System.err(28966):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 您的适配器是否扩展了Serializable 类?
  • 是的,确实如此:“类 SerializableArrayAdapter 扩展 ArrayAdapter 实现 Serializable”。
  • 该原则似乎适用于“常规”对象,但由于某种原因不适用于我的 ArrayAdapter 扩展版本。
  • 你遇到了什么错误?

标签: android serialization deserialization android-arrayadapter


【解决方案1】:

异常是在代码的哪一行引发的?

看看这个: 保存:

FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(your object);
os.close();

加载:

FileInputStream fis = context.openFileInput(fileName);
ObjectInputStream is = new ObjectInputStream(fis);
YourClass yourObject = (YourClass) is.readObject();
is.close();
return yourObject;

这应该会让你回到正轨

【讨论】:

  • 不起作用。错误出现在“adapter = (SerializableArrayAdapter) ois.readObject ();”这一行。虽然我只是按照您的指示更正了这一点,但在开头添加了“SerializableArrayAdapter”。
  • 你能发布与错误相关的logcat吗?这可能是一些反射问题。
  • 嗯,有没有办法只复制 text 部分?否则会变得非常混乱......
  • 过滤 logcat 以仅输出包中的内容和错误。
  • 好吧,我已经发布了 logcat 但是,嗯,它看起来很乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2013-11-01
相关资源
最近更新 更多