【问题标题】:How to serialize an arraylist如何序列化一个arraylist
【发布时间】:2012-08-06 21:39:08
【问题描述】:

我正在尝试序列化这个数组列表:

static ArrayList<Product> Chart=new ArrayList<Product>();

使用这些对象:

double Total;
String name;
double quantity;
String unit;
double ProductPrice

这是目前的课程:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Product implements Serializable{
double Total;
String name;
double quantity;
String unit;
double ProductPrice;

public Product(String n)
{
    name=n;
}
private void writeObject(ObjectOutputStream s) throws IOException
{
    s.defaultWriteObject();
    Product pt=new Product(name);
    ObjectOutputStream oos=new ObjectOutputStream(s);
    oos.writeObject(pt);
}
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException
{
    s.defaultReadObject();
    Product pt;
    ObjectInputStream ios =new ObjectInputStream(s);
    ObjectInputStream ois = null;
    pt=(Product)ois.readObject();
}


}

我正在尝试序列化和反序列化 arraylist(在另一个类中声明),以便在运行时之间保存 arraylist 中的对象。有什么想法吗?

【问题讨论】:

  • ArrayList 实现 Serializable... 有什么问题?
  • 如果可以更简单,就不要让事情变得更难[如何使用 Xstream 库将列表序列化为 xml][1] [1]:stackoverflow.com/questions/10051501/…

标签: java serialization arraylist


【解决方案1】:

为什么要在这些方法中创建新的Product 对象?它们不是静态的,所以我认为它们应该在this 上运行?您还尝试在刚刚设置为 null 的对象上调用 readObject()

如果您能提供更多关于您看到的错误以及您如何使用它的详细信息,我们可能会提供更多帮助。

编辑:添加了一些示例代码

写出来:

    Product p = new Product("My Product");
    try
    {
       FileOutputStream fileOut =
       new FileOutputStream("product.ser");
       ObjectOutputStream out = new ObjectOutputStream(fileOut);
       out.writeObject(p);
       out.close();
       fileOut.close();
    } catch(IOException ioe)
    {
        ioe.printStackTrace();
    }

阅读:

    Product p = null;
    try
    {
        FileInputStream fileIn = new FileInputStream("product.ser");
        ObjectInputStream in = new ObjectInputStream(fileIn);
        p = (Product) in.readObject();
        in.close();
        fileIn.close();
    } catch(IOException ioe)
    {
        ioe.printStackTrace();
        return;
    } catch(ClassNotFoundException c)
    {
        System.out.println(.Product class not found.);
        c.printStackTrace();
        return;
    }

【讨论】:

  • 我没有任何错误,我只是不知道从哪里开始。这是我第一次使用序列化任何东西
  • 好的,我已经更新了帖子以显示一些适用于您的课程的示例代码。您可以从类中删除读取和写入方法,并在main(或任何地方)中使用此代码来写入或读取正在使用的对象。
【解决方案2】:

看起来Product 不需要提供readObjectwriteObject 方法。您应该能够按原样序列化和反序列化 List

我建议将列表包装在一个在上下文中有意义的类中。 (我不知道上下文是什么,或者顺序是什么(Set 会更好)。)另外,可变静态通常是一个坏主意,特别是如果您要尝试序列化和反序列化引用的对象。

【讨论】:

    【解决方案3】:

    ArrayList 类已经实现了 Serializable,并且您使您的类(产品)可序列化;一切似乎都写信给我。 “这样数组列表中的对象将在运行时之间保存。”你让它听起来像是你认为它应该在每次运行它之间自动保存它们;这可能是你的错误。您必须将其写入文件,并在下一次执行时读取它(使用 ObjectOutput(/Input)Streams)

    【讨论】:

      猜你喜欢
      • 2015-04-14
      • 1970-01-01
      • 2013-12-14
      • 2014-04-12
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      相关资源
      最近更新 更多