我在学校有这个作业。它包括创建一个“Person”类,并将每个对象放入一个列表中。每个 Person 对象都应该有一个唯一的 ID。这是通过在类中定义 static 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 个对象都存在),然后创建第四个对象,第四个对象是给定 userid 1. 如何通过关闭/重新打开程序来保留 nextmember 值?
尝试用谷歌搜索它,但我在这个主题上所能找到的只是“序列化静态变量没有意义”,所以也许我应该找到一种不同的用户 ID 管理方法?
谢谢,
埃里克
最佳答案
将序列与对象持久化确实没有意义。
让我们尝试一下这个想法,我们将用一个对象保存nextmember
。想象一下以下系列:
- 创建
MyClass
的实例 1,id=1,seq=1 - 创建实例2,id=2,seq=2
- 序列化实例1,id=1,seq=2
- 创建实例3,id=3,seq=3
- 反序列化instance1,设置seq=2
- 创建实例4,id=3,seq=3
因此,您有 2 个具有相同 ID 的实例(实例 3 和实例 4)。
如果您确实想要序列化状态,则可以为序列创建一个单独的类(和实例)。但它仍然应该是类的静态属性。
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。
请注意,序列号可能会被多个线程访问,因此对它的访问应该同步
。
关于用于自动递增的Java静态变量(userID)ObjectOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15029445/