自动增量(userID)ObjectOutputStream的Java静态变量

自动增量(userID)ObjectOutputStream的Java静态变量,java,serialization,static,Java,Serialization,Static,我在学校有这个作业。它包括创建一个“Person”类,并将每个对象放入列表中。每个Person对象都应该有一个唯一的ID。这是通过在类中定义静态int来实现的,如下所示: public class MyClass implements Serializable { private static int nextmember; private int userid; public MyClass() { userid = nextmember++; } } 这已经足

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

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

  public MyClass()
  {
    userid = nextmember++;
  }
}
这已经足够好了,第一个对象获取userid 1,下一个对象获取userid 2,等等。我的挑战是在保存到文件时如何处理这个问题?我使用ObjectOutputStream和ObjectInputStream

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

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

谢谢,

Erik

将序列与对象保持在一起真的没有意义

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

  • 创建MyClass的实例1,id=1,seq=1
  • 创建实例2,id=2,seq=2
  • 序列化实例1,id=1,seq=2
  • 创建实例3,id=3,seq=3
  • 反序列化实例1,set seq=2
  • 创建实例4,id=3,seq=3
因此,您得到了两个具有相同id的实例(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();
    }
}
您应该单独(反)序列化该序列,并使用单独的getter/setter将其设置为MyClass

请注意,序列号可以从多个线程访问,因此对它的访问应该是同步的

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

我并不是说这是一个好的解决方案,但解决这个问题的最简单方法是将静态“nextmember”字段的值持久化到文件中

e、 g


我想应该是“publicsynchronizedintgetnext()”,没有static关键字,只是说。谢谢你的输入。我知道我必须阅读序列化,但对于这个任务,我认为我将坚持使用@Xander解决方案。当然,我应该多看看。谢谢!帮助很大。我不是那个判断你的解决方案有多好的人,但这个解决方案至少与我们到目前为止所学到的是一致的。
ObjectOutputStream objectOutputStream = ...;
objectOutputStream.writeInt(MyClass.nextmember);
// write your users

ObjectInputStream objectInputStream = ...;
MyClass.nextmember = objectInputStream.readInt()
// read your users