【问题标题】:Java saving an object by dateJava按日期保存对象
【发布时间】:2012-12-11 09:22:04
【问题描述】:

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

}

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

【问题讨论】:

    标签: java exception object file-io io


    【解决方案1】:

    正如例外所说,类(在本例中为Product)不可序列化。您可能可以摆脱这种变化:

    class Product implements Serializable {
         // Code as before
    }
    

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

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

    另外:

    • 你在文件名中隐式使用了Product.toString(),但这不会给你任何有用的东西。您想要文件名基于什么?
    • 您没有对 cal 执行任何操作 - 您希望如何存储当前日期/时间?

    【讨论】:

    • 代码首先看起来不同(因此标题带有日期),但我认为这是导致问题的原因,所以我放弃了。我正在使用 getTitle() 方法保存文件,并希望将文件保存在以日期为名称的目录中。感谢您的快速回答,它有效!以及如何仅为以下目录添加日期:\12252012\product1.product
    • @Selim:这就是为什么花时间写一个问题很重要……确保它是一致的,并且只包含你需要的代码和文本。现在,听起来您的第二个问题实际上是关于将日期格式化为字符串...查看SimpleDateFormat
    • 再次感谢!这是我的第一个问题,希望那些会变得更好:-)
    • @Selim:没问题。如果您有时间,您可能想阅读我的指南以提出非常好的问题:tinyurl.com/so-listtinyurl.com/so-hints
    【解决方案2】:

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

    class Product implements Serializable {
    

    tutorial Link for Object Serialization in java

    【讨论】:

    • 不客气。如果您勾选接受的答案,那就太好了。
    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2015-12-11
    相关资源
    最近更新 更多