2

我在学校有这个作业。它包括创建一个“Person”类,并将每个对象放在一个列表中。每个 Person 对象都应该有一个唯一的 ID。这是通过在类中定义一个静态 int 来实现的,如下所示:

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

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

这很好用,第一个对象获取用户 ID 1,下一个对象用户 ID 2 等。我的挑战是如何在保存到文件时处理这个问题?我使用 ObjectOutputStream 和 ObjectInputStream。

因此,如果我创建 3 个对象,1、2 和 3,关闭我的程序(所有内容都保存到文件中),重新打开程序(所有 3 个对象都存在),然后创建第四个对象,第四个对象的用户 ID 为 1 . 如何通过关闭/重新打开程序来保留 nextmember 值?

尝试用谷歌搜索它,但我能在这个主题上找到的只是“序列化静态变量没有意义”,所以也许我应该找到一种不同的用户 ID 管理方法?

谢谢,
埃里克

4

3 回答 3

3

用对象保持序列确实没有意义。

让我们玩一下这个想法,我们将保存nextmember一个对象。想象以下系列:

  • 创建实例MyClass1,id=1,seq=1
  • 创建instance2,id=2,seq=2
  • 序列化instance1,id=1,seq= 2
  • 创建instance3,id=3,seq=3
  • 反序列化instance1,设置seq=2
  • 创建实例4,id=3,seq=3

因此,您有 2 个实例(实例 3 和实例 4)具有相同的 id。

如果你真的想序列化状态,你可以为序列设置一个单独的类(和实例)。但它仍然应该是类的静态属性。

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();
    }
}

您应该单独(反)序列化序列,并使用单独的 getter/setter 将其设置为 MyClass。

请注意,序列号可能被超过 1 个线程访问,因此对它的访问应该是synchronized.

于 2013-02-22T17:09:50.257 回答
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 回答
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 回答