【问题标题】:Write ArrayList of custom objects to File将自定义对象的 ArrayList 写入文件
【发布时间】:2014-07-04 11:48:53
【问题描述】:

我有一个包含自定义服务对象的 ArrayList。我想将整个 ArrayList 写入一个文件,然后再读取它。

我为此尝试了 Gson,但它给了我一个 IllegalStateException: Expected BEGIN_ARRAY but is STRING。我让它记录我应该是 JSON 的字符串,它在其中说了很多异常(作为字符串中的文本..也许转换出错了?)。

public int saveListToFile(){
        String filename = "service_entries";
        File file = new File(getFilesDir(), filename);
        try {
            BufferedWriter buffWriter = new BufferedWriter(new FileWriter(file, true));

            Gson gson = new Gson();
            String json = gson.toJson(services); //this is the ArrayList<Service>

            buffWriter.append(json);
            buffWriter.newLine();
            buffWriter.close();
        } catch (IOException e) {
            return -1;
        }

        return 0;
}

public int readCurrentList(){   
        String filename = "service_entries";

        File file = new File(getFilesDir(), filename);  
        try {
            BufferedReader buffReader = new BufferedReader(new FileReader(file));

            String line1, line2;
            Gson gson = new Gson();

            line1 = buffReader.readLine();
            line2 = buffReader.readLine();

            if(line1 == null){
                buffReader.close();
                return 0;
            }

            Type type = new TypeToken<ArrayList<Service>>(){}.getType();
            services = gson.fromJson(line1, type);

            ArrayList<Service> list2;
            if(line2 != null){
                list2 = gson.fromJson(line2, type);

                services.addAll(list2);
                list2 = null;
            }

            buffReader.close();
        } catch(IOException e){
            return -1;
        }

        return 0;
}

public class Service {

        private double quantity;
        private String description;

        public Service(){
            quantity = 0.0;
            description = null;
        }

}

【问题讨论】:

    标签: java android json gson


    【解决方案1】:

    我建议对此类操作使用序列化。您可以实现 Java 的 Serializable 接口,然后您可以将您的对象压缩到一个 .ser 文件中,然后从该文件中将它们膨胀回来以从它们中调用您需要的方法。

    这是一个关于序列化的好教程 - http://www.tutorialspoint.com/java/java_serialization.htm

    【讨论】:

      【解决方案2】:

      只需稍加调整,您的 json 方法就可以正常工作。然而,Booch 的解决方案将是满足此类要求的理想建议。

      由于您要附加到文件,以下方法会将对象附加到文件中,并且在读取它时将读取所有先前写入的列表并将其添加到单个列表中。由于 services 是一个全局变量,您应该考虑在读取方法之前对其进行初始化或清除它以避免重复。

      public int saveListToFile() {
          String filename = "service_entries";
          File file = new File(getFilesDir(), filename);
          try {
              BufferedWriter buffWriter = new BufferedWriter(new FileWriter(file, true));
              Gson gson = new Gson();
              Type type = new TypeToken<List<Service>>() {}.getType();
              String json = gson.toJson(services, type);
              buffWriter.append(json);
              buffWriter.newLine();
              buffWriter.close();
          } catch (IOException e) {
              return -1;
          }
          return 0;
      }
      
      public int readCurrentList() {
          String filename = "service_entries";
          File file = new File(getFilesDir(), filename);
          try {
              BufferedReader buffReader = new BufferedReader(new FileReader(file));
              String line;
              Gson gson = new Gson();
              Type type = new TypeToken<List<Service>>() {}.getType();
              while ((line = buffReader.readLine()) != null) {
                  services.addAll(gson.fromJson(line, type));
              }
              buffReader.close();
          } catch (IOException e) {
              return -1;
          }
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多