【问题标题】:Reading objects from assets从资产中读取对象
【发布时间】:2018-08-28 10:14:14
【问题描述】:

有些事情真的搞砸了。我在资产文件夹中有一个“.ser”文档,其中存储了 Objetcs 的 ArrayList。在一个 android 应用程序中,我想读取这些对象。有很多与此问题相关的帖子,但是没有一个可以解决我的问题。奇怪的是,当我在非 android 上下文/“普通”java 中使用类似代码时,它可以正常工作。在这里,最后一行抛出 NullPointerException - 出了什么问题?

public void getData() {
    ArrayList<MyClass> output= null;
    InputStream is = null;
    ObjectInputStream ois = null;
    try{
        is = this.getAssets().open("data.ser");
        ois = new ObjectInputStream(is);

        output = (ArrayList<MyClass>)ois.readObject();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            ois.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    Log.d("TAG", output.get(0).getId());
}

【问题讨论】:

  • 是用ObjectOutputStream写的.ser文件吗?
  • @NarayanaReddy 是的。
  • 最后一行的空指针可能是因为输出数组列表的大小可能为零,或者数组列表本身为空。是哪一个?

标签: java android objectinputstream


【解决方案1】:

我会创建一个类并将数组放在一个对象中:

public class ListObjects implements Serializable {

    List<MyClass> listMyClass = new ArrayList<>();

    public ListObjects(){

    }

    public List<MyClass> getListMyClass() {
        return listMyClass;
    }

    public void setListMyClass(List<MyClass> listMyClass) {
        this.listMyClass = listMyClass;
    }

}

我遇到了类似的问题。这是因为java应用程序中的包名与android中的包名不同。因此我不承认它们是平等的对象。我就是这样做的:

public static Object fromData(byte[] data) {
        ObjectInputStream ois = null;
        Object object = null;
        try {
            ois = new ObjectInputStream(
                    new ByteArrayInputStream(data));
            object = ois.readObject();
        } catch (Exception ex) {
            Logger.getLogger(ModeloApp.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                ois.close();
            } catch (Exception ex) {
                Logger.getLogger(ModeloApp.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return object;
    }

【讨论】:

  • 嗯.. 听起来很合理,但是在我第一次尝试时似乎不起作用。如果我在应用程序中创建文件,也许它可以工作。
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多