2

シリアライゼーションは、オブジェクト内のすべての変数を含むオブジェクトのインスタンスを保存するための簡単な方法であり、静的参照と transient キーワードでマークされたものを除くことを理解しています。

私は I/O が苦手で、私のアプリケーションには約 50 のクラスがあり、そのうち 3 つの異なるオブジェクト (オブジェクトを含む) があります。

たとえば、Animal ClassEmployee ClassVehicle Classがあります。実行時に、独自のサブクラス、メソッドなどを含むインスタンスオブジェクトを含むすべて。

私の質問は、シリアル化でこのすべての情報を保存する最も簡単な方法は何ですか? 私はこの問題を教授と話し合ったところ、彼はすべてに「手」を持ち、それをシリアライズする包括的なクラス「 Data.class 」のようなものを提案しました。これにより、参照するすべてのオブジェクトが .ser ファイルに保存されます。

「 Data.class」を作成してから、50 個すべてのクラスを作成してDataを拡張することを考えました。そして、保存メソッドに次のようなことをさせます

public void saveData(){
       Data myData = new Data()
try
      {
         FileOutputStream fileOut =
         new FileOutputStream("Data.ser");
         ObjectOutputStream out =
                            new ObjectOutputStream(fileOut);
         out.writeObject(myData);
         out.close();
          fileOut.close();
      }catch(IOException i)
      {
          i.printStackTrace();
      }
}

しかし、私はこれを機能させることができないようです。すべてのサブクラスのデフォルト値のみを含む Data の空のインスタンスを作成しているためだと思います。保存しようとしているときに関数を呼び出しています (対応するオブジェクトのすべての値が入力された後)。

どんな助けでも大歓迎です。3 つの異なるタイプのオブジェクトのすべてのインスタンスを手動でシリアル化する必要はありませんか? それは 300 を超えています。

また、Data に serialVersionID を指定し、Data のシリアル化可能なインターフェイスを実装しました。

4

2 に答える 2

4

すべてのクラスがSerializableインターフェイスを実装していることを確認し、このクラスには、、、およびその他のクラスをシリアル化Data/逆シリアル化するメソッドがあります。AnimalEmployeeVehicle

単一のメソッドを持つことで、これを簡単に行うことができますsaveData(Serializable serializable, String fileName)。これは、必要に応じたスケルトンになります (実際のコードに基づく):

public class Data {

    public void saveData(Serializable serializable, String fileName) {
        try {
            FileOutputStream fileOut = new FileOutputStream(fileName);
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(myData);
            out.close();
            fileOut.close();
        } catch(IOException i) {
            i.printStackTrace();
        }
    }
}
于 2012-11-11T04:39:50.550 に答える
0

シリアライズしたくない変数を一時的または静的としてマークします。さらに詳しい情報が必要な場合や興味がある場合は、こちらをご覧ください。

于 2012-11-11T04:42:15.097 に答える