2

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

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 中的对象。有任何想法吗?

4

3 回答 3

5

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

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

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

把它写出来:

    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;
    }
于 2012-08-06T21:43:29.753 回答
1

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

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

于 2012-08-06T22:05:06.620 回答
0

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

于 2012-08-06T21:43:50.623 回答