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()また、設定したばかりの Objectを呼び出そうとしています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提供する必要はないようです。そのままシリアル化および逆シリアル化できるはずです。readObjectwriteObjectList

コンテキストで意味のあるクラスでリストをラップすることをお勧めします。(コンテキストが何であるか、または順序が何であるかはわかりません(Setより良いでしょう)。)また、特に参照されたオブジェクトをシリアライズおよびデシリアライズしようとする場合は、変更可能な静的は一般的に悪い考えです。

于 2012-08-06T22:05:06.620 に答える
0

ArrayList クラスは既に Serializable を実装しており、クラス (Product) をシリアライズ可能にしました。すべてが私に書いているようです。「arraylist 内のオブジェクトがランタイム間で保存されるようにします。」実行するたびに自動的に保存する必要があると思うように聞こえます。これはあなたの間違いかもしれません。ファイルに書き込み、次の実行で読み取る必要があります (ObjectOutput(/Input)Streams を使用します)。

于 2012-08-06T21:43:50.623 に答える