0

我正在尝试将对象保存到具有以下类的文件中,但它给了我 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); 
      }
    }
  }

}

而类 Product 看起来像这样:

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

}

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

4

2 回答 2

5

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

class Product implements Serializable {

java中对象序列化的教程链接

于 2012-12-25T11:08:59.430 回答
3

正如例外所说,类(Product在这种情况下)是不可序列化的。您可能可以摆脱这种变化:

class Product implements Serializable {
     // Code as before
}

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

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

此外:

  • Product.toString()在文件名中隐式使用,但这不会给您任何有用的东西。您希望文件名基于什么?
  • 你没有做任何事情cal- 你希望如何存储当前日期/时间?
于 2012-12-25T11:09:25.813 回答