在Java Serlization中我们必须使用串行版本ID生成方法吗?

时间:2015-08-17 13:04:33

标签: java serialization

如果我在我的应用程序的每个类上实现Serializable,以便可以在Jboss集群环境中轻松运行应用程序。

现在如果我在我的课程中实现了Serializable,那么eclipse会显示在下面的消息

  

serializable类不声明静态   long的最终serialVersionUID字段

现在它给了我三个选项

  1. 添加默认串行版本ID
  2. 添加生成的串行版本ID
  3. 将@SuppressWarings添加到'serial'
  4. 如果我先选择它会产生这样的

      private static final long serialVersionUID = 1L;
    

    如果我选择第二个,它会像这样生成

      private static final long serialVersionUID = 1629728947486980072L;
    

    第三,我们可以轻松忽略,因为我们必须在集群环境中运行应用程序,所以我们必须无论如何都要添加versionID What is a serialVersionUID and why should I use it?

    现在正如我所说的那样,我必须实现每个系列化和非常类的哪个更好的方法。 Approach1或Appraoch2?

    1. 添加默认串行版本ID
    2. 添加生成的串行版本ID

2 个答案:

答案 0 :(得分:1)

serialVersionUID构成一个合乎逻辑的负担:它应该小心维护。

它的隐式生成(编译器哈希方法签名等)是有限的。所以没有压制警告。

最佳版本应尽可能保持相同,并可能更新旧类定义的持久对象。

至少在新的类定义中,必须更改serialVersionUID

为了使更改更具吸引力,我使用日期时间形式的serialVersionUID yyyyMMddHHmm:

 private static final long serialVersionUID = 201508171605L;

日期时间2015-08-17T16:05。

顺便说一句:申请下划线的好机会:

 private static final long serialVersionUID = 2015_08_17__16_05L;

这使得监督版UID更容易识别。

答案 1 :(得分:0)

java.io.Serializable doc说:

  

序列化运行时与每个可序列化的类a关联   版本号,称为serialVersionUID,在此期间使用   反序列化以验证序列化的发送方和接收方   object已加载与该对象兼容的类   尊重序列化。如果接收器已加载了一个类   具有与其不同的serialVersionUID的对象   相应的发件人的类,然后反序列化将导致   InvalidClassException

因此,您可以将serialVersionUID视为'哈希代码'你的班级因此,第二种方法肯定更好,因为第一种方法非常相似(几乎相同)将@SuppressWarings添加到' serial'

有关详细信息,请访问this blog