Java序列化:静态变量不可序列化:解决方法

时间:2014-01-06 03:03:20

标签: java serialization static

好的,所以这个问题主要与以下问题有关:有更好的方法吗?

我有一个电话簿应用程序,你可以添加用户,删除它们等,每个人被分配一个不同的ID#。 Person类将lastID用作静态类变量。电话簿类有一个人物矢量。

我的解决方法是:为Person类创建一个新的非静态变量,并在序列化/保存时,仅为向量中的第一个元素,将静态变量的数据存储到这个新变量中。然后,在反序列化时,使用第一个Person的变量重新设置静态变量。

回到我原来的问题:是否有更好/更正式/更合适的方法来做到这一点?

2 个答案:

答案 0 :(得分:3)

更好的解决方案(IMO)是使lastIdUsed成为PhoneBook类的实例字段。听起来你已经在序列化该类的一个实例......

FWIW - 使lastIdUsed Person的实例字段只是糟糕的对象建模。该字段几乎永远不会有用,几乎永远不会有有效值。对于Person中的第一个序列化PhoneBook,它只有一个有效值。

答案 1 :(得分:0)

首先,我会完全避免这种事情。静态变量由于某种原因是不可序列化的,即通过反序列化某些会使其他对象的状态无效的东西。例如,如果您的lastUsedId为10,并且您将对象的反序列化为5,则可能会导致创建重复项(6-10)。

但是,如果您仍然要这样做,请查看Externalizable界面。它允许您控制对象的序列化和反序列化。这里[1]是一个很好的讨论。在过去,我使用Externalizable来更严格地控​​制被序列化对象的格式以节省空间。如果确实想要,可以序列化静态变量并在反序列化时设置它。如果它高于当前内存中的值,您甚至可以设置它。同样,像其他评论者一样,我会完全反对这种方法,但学习这些东西并没有什么坏处,嗯?

[1] What is the difference between Serializable and Externalizable in Java?