android - 如何从文件中检索 MPAndroidChart ArrayList

android - How to retrieve MPAndroidChart ArrayList from file

我在我的应用程序中使用 MPAndroidChart,我想将 ArrayList 保存在一个文件中,供以后使用。 这是我将其保存到内部存储文件中的位置:

ArrayList<Entry> entries = getIntent().getParcelableArrayListExtra(getString(R.string.entries_key));

// Save chart data
FileOutputStream out;
try {
  out = openFileOutput("listFile", MODE_PRIVATE);

  ObjectOutputStream outputStream = new ObjectOutputStream(out);
  outputStream.writeObject(entries);
  outputStream.close();

  } catch (Exception e) {
     e.printStackTrace();
  } finally {
  try {

    if (out != null) {
      out.close();
    }

  } catch (IOException e) {
    e.printStackTrace();
  }
}

这里是我尝试检索它的地方,但返回的 ArrayList 不包含任何数据和我的 LineChart 中的默认文本 ("No chart data available"):

File listFile = new File(getFilesDir(), "listFile");

if(listFile.exists()) {

    FileInputStream inputStream = null;
    try {

        inputStream = openFileInput("listFile");
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);

        // This line is evil
        ArrayList <Entry> entries = (ArrayList<Entry>) objectInputStream.readObject();

        // Set chart properties
        chart = ChartUtils.setChartProperties(chart);

        LineDataSet lineDataSet = ChartUtils.createSet(ChartViewer.this, entries);

        LineData data = new LineData(lineDataSet);
        chart.setData(data);

        // Let the chart knows data has changed
        chart.notifyDataSetChanged();
        chart.invalidate();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

我仔细检查了一下,我确定我正在读取正确的文件,所以问题一定出在这一行

ArrayList <Entry> entries = (ArrayList<Entry>) objectInputStream.readObject();

我在这里找到了这种从文件中读取 ArrayList 的方法 How to write an ArrayList to file and retrieve it?

我该怎么做才能解决这个问题? 谢谢

ObjectOutputStream 的文档说:

Only objects that support the java.io.Serializable interface can be written to streams

ArrayList 实现了 Serializable 接口,但它引用了 Entry class 而没有实现。因此,Entry 对象未序列化(即未保存或恢复)。

我以一种笨拙的方式解决了它。我创建了一个实现 Serializable

的自定义 MyEntry class
public class MyEntry implements Serializable {

   private float x;
   private float y;

   public MyEntry(float x, float y) {
       this.x = x;
       this.y = y;
   }

   public MyEntry(){

   }

   public float getX() {
       return x;
   }

   public float getY() {
       return y;
   }

   public void setX(float x) {
       this.x = x;
   }

   public void setY(float y) {
       this.y = y;
   }
} 

然后,当我需要保存数据时,我从 ArrayList<Entry> 中获取它们并将它们存储在 ArrayList<MyEntry>

// Save chart data
FileOutputStream out = null;

out = openFileOutput(recordName, MODE_PRIVATE);
ObjectOutputStream outputStream = new ObjectOutputStream(out);
ArrayList<MyEntry> myEntries = new ArrayList<>();

for (int k = 0; k < entries.size(); k++) {
  Entry currentEntry = entries.get(k);
  MyEntry currentMyEntry = new MyEntry();
  currentMyEntry.setX(currentEntry.getX());
  currentMyEntry.setY(currentEntry.getY());
  myEntries.add(currentMyEntry);
}

outputStream.writeObject(myEntries);
outputStream.close();

当我需要读回值时,我从 MyEntry 对象中取出它们并放入 Entry 对象

FileInputStream inputStream;

inputStream = openFileInput(fileListName);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);

ArrayList <MyEntry> myEntries = (ArrayList<MyEntry>) objectInputStream.readObject();
ArrayList<Entry> entries = new ArrayList<>();
for (int i = 0; i < myEntries.size(); i++) {
  MyEntry currentMyEntry = myEntries.get(i);
  Entry currentEntry = new Entry();
  currentEntry.setX(currentMyEntry.getX());
  currentEntry.setY(currentMyEntry.getY());
  entries.add(currentEntry);
}

// Set chart properties
chart = ChartUtils.setChartProperties(chart);

LineDataSet lineDataSet = ChartUtils.createSet(ChartViewer.this, entries);

LineData data = new LineData(lineDataSet);
chart.setData(data);