首页 > 解决方案 > 从资产中读取对象

问题描述

事情真的搞砸了。我在资产文件夹中有一个“.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());
}

标签: javaandroidobjectinputstream

解决方案


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

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;
    }

推荐阅读