2

私は学校でこの任務を持っています。これには、「Person」クラスの作成と、各オブジェクトのリストへの追加が含まれます。各Personオブジェクトには一意のIDが必要です。これは、次のようにクラスで静的intを定義することによって実現されます。

public class MyClass implements Serializable
{
  private static int nextmember;
  private int userid;

  public MyClass()
  {
    userid = nextmember++;
  }
}

これは十分に機能します。最初のオブジェクトはユーザーID1、次のオブジェクトはユーザーID 2などを取得します。私の課題は、ファイルに保存するときにこれをどのように処理するかです。ObjectOutputStreamとObjectInputStreamを使用します。

したがって、1、2、3の3つのオブジェクトを作成すると、プログラムを閉じ(すべてがファイルに保存されます)、プログラムを再度開き(3つのオブジェクトすべてが存在します)、4番目のオブジェクトを作成すると、4番目のオブジェクトにユーザーID1が与えられます。 。プログラムを閉じたり再度開いたりして、次のメンバーの値を保持するにはどうすればよいですか?

グーグルで試してみましたが、「静的変数をシリアル化するのは意味がない」ということしかわかりませんでした。ユーザーID管理の別のアプローチを見つける必要があるのではないでしょうか。

ありがとう、
エリック

4

3 に答える 3

3

オブジェクトでシーケンスを永続化する意味は実際にはありません。

この考えで遊んでみましょうnextmember、オブジェクトで保存します。次のシリーズを想像してみてください。

  • MyClass、id = 1、seq=1のinstance1を作成します
  • instance2、id = 2、seq=2を作成します
  • instance1、id = 1、seq= 2をシリアル化します
  • instance3、id = 3、seq=3を作成します
  • instance1を逆シリアル化し、seq=2を設定します
  • instance4、id = 3、seq=3を作成します

したがって、同じIDを持つ2つのインスタンス(instance3とinstance4)を取得しました。

本当に状態をセラライズしたい場合は、シーケンス用に別のクラス(およびインスタンス)を作成できます。ただし、それでもクラスの静的プロパティである必要があります。

public class Seq implements Serializable {
    private int next = 1;
    public synchronized int getNext() { 
        return next++; 
    }
}

public class MyClass implements Serializable {
    private static Seq seq;
    public MyClass() {
        userid = seq.getNext();
    }
}

シーケンスを個別に(逆)シリアル化し、個別のゲッター/セッターを使用してMyClassに設定する必要があります。

シーケンス番号には複数のスレッドからアクセスできるため、アクセスする必要があることに注意してくださいsynchronized

于 2013-02-22T17:09:50.257 に答える
0

試す

    class IdGenerator implements Serializable {
        private static IdGenerator instance = new IdGenerator();
        private int nextId;

        private IdGenerator () {
        }

        public static int nextId() {
            return instance.nextId++;
        }

        // readResolve method to preserve singleton property
        private Object readResolve() {
            return instance;
        }
    }

    class MyClass implements Serializable {
        private int userid;

        public MyClass() {
            userid = IdGenerator.nextId();
        }
    }
于 2013-02-22T17:15:05.930 に答える
0

これが良い解決策だと言っているわけではありませんが、これを解決する最も簡単な方法は、静的な「nextmember」フィールドの値をファイルに永続化することです。

例えば

ObjectOutputStream objectOutputStream = ...;
objectOutputStream.writeInt(MyClass.nextmember);
// write your users

ObjectInputStream objectInputStream = ...;
MyClass.nextmember = objectInputStream.readInt()
// read your users
于 2013-02-22T17:20:32.557 に答える