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

标签 java serialization static

我在学校有这个作业。它包括创建一个“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/

相关文章:

java - 为什么退出应用程序时会出现应用程序崩溃?

java - Java 导致 Oracle 中存在大量非 Activity session

c++如何创建写入xml以及如何从中读取?

java - 将多个 java 对象写入单个文件

ios - 使用静态变量还是通过 View Controller ? iOS

java - 登录 局域网内计算机的用户名 java

java - 自动生成包装器以防止 "malicious downcast"?

mysql - 使用 ManyToManyField 序列化模型时出现 Django REST 错误

c# - Doxygen 没有记录静态类?

android - 静态变量在两个 Activity 之间不起作用