自动增量(userID)ObjectOutputStream的Java静态变量
我在学校有这个作业。它包括创建一个“Person”类,并将每个对象放入列表中。每个Person对象都应该有一个唯一的ID。这是通过在类中定义静态int来实现的,如下所示:自动增量(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++; } } 这已经足
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
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