【问题标题】:Java - Saving an ArrayList<ObjectType> : application crashJava - 保存 ArrayList<ObjectType> :应用程序崩溃
【发布时间】:2012-08-24 12:08:21
【问题描述】:

我需要一种方法来保存 ArrayList 的对象。我在网站上浏览了类似的问题,并且(似乎 ;-) 已经实现了我发现的内容,但我遇到了两个问题:

  1. 如果我将类定义为Serializable 并放入构造函数,它会在启动时崩溃
  2. 否则,不保存数组

你能帮忙吗?我正在为一个志愿者的项目开发代码,但我被困住了......

非常感谢您。

我的应用程序定义了以下类:Globals(文件 Globals.java)


public class Globals extends Application implements Serializable {  

    private int position=-1;
    private ArrayList<RaccoltaPunti> raccoltePuntiList = new ArrayList<RaccoltaPunti>();
    public static final long serialVersionUID = 1L;
    /** constructor - seem required by Serializable, but creating it crashes app */
    public Globals(int position, ArrayList<RaccoltaPunti> raccoltePuntiList) {
        this.position = position;
        this.raccoltePuntiList = raccoltePuntiList;
    }
     // {getters and setters…}

    public void saveData(){

        String filename = getResources().getString(R.string.GLB_filename);
        String fileWithPath = this.getFilesDir().getPath().toString()+"/"+filename;
        Toast.makeText(this, "Salvataggio testo..."+ fileWithPath, Toast.LENGTH_LONG).show();
        try {
            FileOutputStream fos = new FileOutputStream(fileWithPath);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(this.raccoltePuntiList);    
            oos.close();
            Toast.makeText(Globals.this, "DatiSalvati ", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            Log.e("FileSave", "CDM - IOException", e);
            Toast.makeText(this, "Errore saving file", Toast.LENGTH_LONG).show();
        }
    }
}

引用的类是:RaccoltaPunti.java

public class RaccoltaPunti {

    private String nomeRaccolta;
    private String nomePromoter;
    private String numeroTessera;
    private Long puntiPusseduti;
    private String dataScadenzaPunti;
    private String sitoWeb;
    private String sitoWebUsername;

        // constructor, getters and setters…….
}

【问题讨论】:

  • 当它崩溃时你能发布堆栈跟踪吗?
  • 异常告诉你究竟出了什么问题。不要只是忽略它,也不要只是将您看到的每个错误都归结为“应用程序崩溃”。

标签: java android serialization crash


【解决方案1】:
  • 如果要保存列表RaccoltaPunti必须是Serializable

【讨论】:

  • 谢谢你们!我会尽力让你们知道的。
【解决方案2】:

尝试创建一个默认构造函数:

public Globals(){

}

由于该类扩展了 Application 类,它将通过反射从外部调用,并且可能需要一个默认构造函数。默认情况下,如果您不编写任何构造函数,则默认构造函数已经存在。

使 RaccoltaPunti 也可序列化

【讨论】:

  • 可序列化类中不需要默认构造函数。 “尝试”和“可能”表示猜测。最后一句话与其他句子相矛盾。没有答案。
  • @EJB.希望您看到“如果我将类定义为 Serializable 并放置构造函数,它会在启动时崩溃”。那次崩溃是因为它是一个 Application 类并且它没有默认构造函数。作为一个应用程序类,它应该被输入到清单文件中,这意味着安卓系统正在调用它。所以我可以肯定地说,它使用反射来调用它。 Bu default,当Android尝试使用反射创建应用程序类的实例时,它正在寻找默认构造函数。所以我提到了序列化的默认值而不是 coz。仔细阅读!!
  • @EJP : 尝试使用参数化构造函数创建一个应用程序类并在 Manifest 文件中提及它,您可以看到我是否正确,您将收到“java.lang.RuntimeException”说明“没有空的构造函数”。你上面说的一件事是正确的......“猜测工作”。但现在我试过了,我确信我是正确的(不是关于序列化,而是关于崩溃)。我尊重你在 Stack Overflow 中的声誉,但作为一个优秀的技术人员意味着你需要倾听其他人的意见,即使他们说的很愚蠢......
  • 亲爱的,我在最后几天无法测试。我会查看您的宝贵建议并尽快给您反馈。
【解决方案3】:


问题似乎已解决(现在文件已成功保存且没有错误,并且通过手动打开它似乎包含所有信息)。
谢谢大家。

我总结了解决方案,以使未来有相同问题的任何其他读者受益。

问题已通过将RaccoltaPunti Serializable 类设为解决,按照以下代码片段:

    import java.io.Serializable;
    ...

    public class RaccoltaPunti implements Serializable {
    ...

我注意到RaccoltaPunti 已经有一个带参数的构造函数:

    public  RaccoltaPunti(
        String nomeRaccolta,
        String nomePromoter,
        String numeroTessera,
        Long puntiPusseduti,
        String dataScadenzaPunti,
        String sitoWeb,
        String sitoWebUsername) {



作为参考,日志中报告的错误指的是代码行:

    oos.writeObject(this.raccoltePuntiList);    



关于Globals 类的构造函数,我的实验表明只要将其注释掉就可以了。我没有尝试所有可能的组合(即带或不带参数):我只是将其删除。

感谢所有帮助过的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多