Android 反序列化异常EOFException的解决

标签: java android 异常 序列化 反序列化
1651人阅读 评论(0) 收藏 举报

项目里之前一直用序列化的方式部署一些缓存,今天在魅族MX5上发现反序列化缓存内容失效了,报错内容如下

java.io.EOFException
    at java.io.DataInputStream.readByte(DataInputStream.java:77)
    at java.io.ObjectInputStream.nextTC(ObjectInputStream.java:505)
    at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:752)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
    at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1113)
    at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:454)
    at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1345)
    at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242)
    at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835)
    at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
    at java.util.ArrayList.readObject(ArrayList.java:661)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1330)
    at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242)
    at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835)
    at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
    at com.imaginato.qravedconsumer.handler.bv.a(Unknown Source)
    at com.imaginato.qravedconsumer.handler.bv.a(Unknown Source)
    at com.imaginato.qravedconsumer.fragment.bl.a(Unknown Source)
    at com.imaginato.qravedconsumer.fragment.bl.doInBackground(Unknown Source)
    at android.os.AsyncTask$2.call(AsyncTask.java:292)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:818)


返序列化的代码如下:

 /**
     * 反序列化一个list
     * @param context
     * @param fileName
     * @param <T>
     * @return
     * @author Alex
     */
    public <T> List<T> getArrayListFromDisk(Context context, String fileName) {
        if (context == null) return null;
        ObjectInputStream ois = null;
        File file = context.getCacheDir();
        String path = file.getAbsolutePath().concat(fileName);
        File target = new File(path);
        if (!target.exists()) {
            Log.i("Alex","没有找到文件"+fileName);
            return null;
        }
        List<T> arrayList = null;
        synchronized (ArrayListLock) {
            try {
                ois = new ObjectInputStream(new FileInputStream(target));
                arrayList = (ArrayList<T>) ois.readObject();
                return arrayList;
            } catch (ClassNotFoundException e) {
                Log.i("Alex", "反序列失败", e);
            } catch (IOException e) {
                Log.i("Alex", "反序列失败2", e);//上面的报错是这里打出来的
            } finally {
                if (ois == null) return null;
                try {
                    ois.close();
                } catch (IOException e) {
                    Log.i("Alex", "反序列失败3", e);
                }
                return arrayList;
            }
        }
    }

一开始我以为是读线程和写线程同时对同一个文件建立流导致的错误,然后给读写方法都加了线程锁,后来发现并不管用,而且读写线程时间间隔很大,几乎不会出现同步的情况。

使用任务管理器强制关闭app的时候经常会出现这种情况

后来发现可能是由于序列化文件损坏引起的,如果在一个线程里对这个文件执行写入操作,而线程没有正常的结束而被强行终止了,可能会导致当前操作的文件损坏,所以导致问题的代码如下

@Override
    public void onDestroy() {
        Log.i("Alex", "fragment2的onStop执行");
        if (aveArrayListToDisk(getActivity(), CARDS_LIST, "/homeCards.tmp"))
            JLogUtils.i("Alex", "序列化卡片到硬盘成功");
        else Log.i("Alex", "序列化卡片失败");
        super.onDestroy();
        Log.i("Alex", "fragment的onDestroy执行了!!!");
    }

这是Fragment的onDestroy()方法,其中“fragment的onDestroy执行了!!!”不会被打印出来.解决方法很简单,把这块IO代码写到onStop()里去就可以了。

这个bug得到的教训是,耗时操作不要放在onDestroy()里,onDestroy()可能不会被执行或者还没等执行完app的进程就被终止了,这对IO操作是致命的。

查看评论

Java反序列化时报异常java.io.EOFException

问题第一种解决办法 在写完对象后,加一句 oos.writeObject(null); 插入null是用来判断是否读取到结尾。oos是ObjectOutputStream实例。 然后读...
  • ysk_xh_521
  • ysk_xh_521
  • 2017-08-19 09:32:38
  • 11432

反序列化过程怎么引发了 java.io.EOFException异常?

本帖最后由 谢冬 于 2013-3-11 04:19 编辑 package com.itheima_01; import java.io.FileInputStream...
  • u012364372
  • u012364372
  • 2016-08-24 17:44:36
  • 3464

Android+HttpURLConnection+ObjectOutputStream+java.io.EOFException

url = new URL(str_remotecallservlerurl); //定义远程CallServlet的url!!! conn = (HttpURLConnection)url.op...
  • wkwanglei
  • wkwanglei
  • 2015-01-05 17:40:58
  • 3297

我的Java开发学习之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法

今天用Ob
  • qq446282412
  • qq446282412
  • 2015-06-11 00:10:52
  • 6409

android http EOFException

最近写腾讯微博,问题遇到不少,其中EOFException是最头疼的一个。这个是下载微博用户头像数据和微博相关图片的时候发生的一个Exception,出错代码如下//System.setPropert...
  • lg707415323
  • lg707415323
  • 2012-08-16 19:09:26
  • 5311

Android串口通信(Android Studio)

android 串口通信
  • qq_35952946
  • qq_35952946
  • 2017-12-21 14:59:49
  • 3302

Android 反序列化异常EOFException的解决

项目里之前一直用序列化的方式部署一些缓存,今天在魅族MX5上发现反序列化缓存内容失效了,报错内容如下 java.io.EOFException     at java.io.DataInputSt...
  • lvshaorong
  • lvshaorong
  • 2016-06-14 18:21:22
  • 1651

Android Studio下的串口程序开发实战

关于Android串口通信在Android Studio中的实现以及使用虚拟串口工具在模拟器下的设置运行...
  • WarweeSZip
  • WarweeSZip
  • 2017-06-09 11:57:00
  • 7529

Android串口通信

Android串口通信 串口通信偏向嵌入式一点,是Android设备通过串口与其他设备进行通信的一种方式,本文介绍的Android纯串口的通信,并不是手机上的USB串口通信。 手机上是没有这个串...
  • q4878802
  • q4878802
  • 2016-11-01 15:39:31
  • 12276

Android串口通信:串口读写

  • 2016年01月13日 17:54
  • 629KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 64万+
    积分: 6545
    排名: 4575
    文章分类
    最新评论