Java按日期保存对象

时间:2012-12-25 11:07:03

标签: java exception object file-io io

我正在尝试使用下面的类将对象保存到文件中,但它给了我java.io.NotSerializableException。

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Calendar;

class Saver {

  Calendar cal = Calendar.getInstance();

  public void save(ArrayList<Product> products) {
    for (int i = 0; i < products.size(); i++) {
      try { 
        FileOutputStream saveFile = new FileOutputStream(
        "/" + products.get(i) + ".product"
        );

        ObjectOutputStream oos = new ObjectOutputStream(saveFile);
        oos.writeObject(products.get(i));
      } catch(Exception ex) {
        System.out.println(ex); 
      }
    }
  }

}

而产品类看起来像这样:

class Product {

  private String title;
  private int id;
  private double price;

  public Product(String title, int id, double price) {
    this.title = title;
    this.id = id;
    this.price = price;
  }

  public String getTitle() {
    return title;
  }

  public int getId() {
    return id;
  } 

  public double getPrice() {
    return price;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public void setId(int id) {
    this.id = id;
  }

  public void setPrice(double price) {
    this.price = price;
  }

}

我做错了什么,如何将对象存储在文件中呢? 提前谢谢!

2 个答案:

答案 0 :(得分:5)

您必须通过实现Serializable接口来序列化您的Product类,该接口是您希望保存状态的类的标记接口。

class Product implements Serializable {

tutorial Link for Object Serialization in java

答案 1 :(得分:3)

正如例外所述,类(本例中为Product)不可序列化。您可能只是躲过这个改变:

class Product implements Serializable {
     // Code as before
}

但您还应考虑声明serialVersionUID字段用于版本控制。阅读Serializable的文档和 lot serialization tutorial更多详细信息。您不需要编写任何新成员 - 它只是一个标记接口 - 但您可以添加其他方法以更好地控制序列化和反序列化。

您还应该考虑其他序列化方法 - 我个人喜欢Google Protocol Buffers,但我有偏见:)考虑您需要的版本控制以及任何跨平台支持。

此外:

  • 您在文件名中隐式使用Product.toString(),但这不会给您带来任何帮助。你想要你的文件名是什么?
  • 您没有对cal做任何事情 - 您希望如何存储当前日期/时间?