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

时间:2013-02-22 17:02:59

标签: java serialization static

我在学校有这个任务。它包括创建一个“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值?

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

谢谢,
埃里克

3 个答案:

答案 0 :(得分:3)

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

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

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

所以,你有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