我在学校有这个任务。它包括创建一个“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值?
尝试谷歌搜索,但我能找到的主题是“序列化静态变量没有意义”,所以也许我应该找到一种不同的用户管理方法?
谢谢,
埃里克
答案 0 :(得分:3)
将序列与对象保持在一起是没有意义的。
让我们玩这个想法,我们将保存带有对象的nextmember
。想象一下以下系列:
MyClass
的实例1,id = 1,seq = 1 所以,你有2个实例,(instance3和instance4)具有相同的id。
如果你真的想要对状态进行seralize,你可以为序列设置一个单独的类(和实例)。但它仍然应该是该类的静态属性。
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();
}
}
您应该(de)单独序列化序列,并使用单独的getter / setter将其设置为MyClass。
请注意,序列号可以从多个线程中访问,因此对它的访问权应为synchronized
。
答案 1 :(得分: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();
}
}
答案 2 :(得分:0)
我并不是说这是一个很好的解决方案,但解决这个问题的最简单方法是将静态“nextmember”字段的值保存到文件中。
e.g。
ObjectOutputStream objectOutputStream = ...;
objectOutputStream.writeInt(MyClass.nextmember);
// write your users
ObjectInputStream objectInputStream = ...;
MyClass.nextmember = objectInputStream.readInt()
// read your users