【得分点】

兼容性、自定义

【参考答案】

标准回答

serialVersionUID是序列化版本,为一个类定义序列化版本,是出于兼容性的考虑。如果某个类随着项目进行了升级,那么对于升级之前序列化的数据,在升级之后反序列化时就很可能出现不兼容的情况。如果事先定义了序列化的版本,则在反序列化的时候,只要版本不变就可以将其认定为同一个class文件。Java采用以下的形式来定义序列化版本:

private static final long serialVersionUID = …;

需要注意的是,如果没有显示定义serialVersionUID,则JVM会根据类的信息自动计算出它的值,如果升级前后类的内容发生了变化,该值的计算结果通常就不同,这会导致反序列化的失败。所以,最好在打算序列化的类中显示地定义serialVersionUID,这样即便在序列化后它对应的类被修改了,由于版本号是一致的,所以该对象依然可以被正确的反序列化。

加分回答

如果类的修改会导致反序列化失败,则应该为此类分配新的serialVersionUID,那么对类的哪些内容进行修改会导致反序列化失败呢?

  1. 如果修改类时只是修改了方法,则反序列化不受影响。
  2. 如果修改类时只是修改了静态变量,则反序列化不受影响。
  3. 如果修改类时改变了实例变量,则可能导致反序列化失败。