转载自:http://blog.youkuaiyun.com/zzjjiandan/article/details/32336079
凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:
当实现java.io.Serializable接口的类未显式声明 serialVersionUID,则Java序列化机制会根据编译的class自动生成一个serialVersionUID值作序列化版本比较用,这种情况下,如果class文件没有发生变化, serialVersionUID也就不会变化的。
强烈建议所有可序列化类都显式声明serialVersionUID值,原因是计算默认的serialVersionUID对类的详细信息具有较高的敏感性,根据编译器实现的不同也可能千差万别,这样在反序列化过程中可能会导致意外的InvalidClassException。同时为保证serialVersionUID值跨不同java编译器实现的一致性,序列化类必须声明一个明确的serialVersionUID值。还建议使用 private修饰符显示声明serialVersionUID,原因serialVersionUID将不会被继承。
显式地定义serialVersionUID有两种用途:
1.在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
2.当序列化了一个类实例后,希望更改一个字段或添加一个字段,不设置serialVersionUID,所做的任何更改都将导致无法反序化旧有实例,并在反序列化时抛出一个异常。如果添加了serialVersionUID,在反序列旧有实例时,新添加或更改的字段值将设为初始化值,字段被删除将不设置。
相关注意事项:
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。
凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:
private static final long serialVersionUID = …;
序列化运行时使用一个称为serialVersionUID的版本号与每个可序列化类相关联,通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)。当实现java.io.Serializable接口的类未显式声明 serialVersionUID,则Java序列化机制会根据编译的class自动生成一个serialVersionUID值作序列化版本比较用,这种情况下,如果class文件没有发生变化, serialVersionUID也就不会变化的。
强烈建议所有可序列化类都显式声明serialVersionUID值,原因是计算默认的serialVersionUID对类的详细信息具有较高的敏感性,根据编译器实现的不同也可能千差万别,这样在反序列化过程中可能会导致意外的InvalidClassException。同时为保证serialVersionUID值跨不同java编译器实现的一致性,序列化类必须声明一个明确的serialVersionUID值。还建议使用 private修饰符显示声明serialVersionUID,原因serialVersionUID将不会被继承。
显式地定义serialVersionUID有两种用途:
1.在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
2.当序列化了一个类实例后,希望更改一个字段或添加一个字段,不设置serialVersionUID,所做的任何更改都将导致无法反序化旧有实例,并在反序列化时抛出一个异常。如果添加了serialVersionUID,在反序列旧有实例时,新添加或更改的字段值将设为初始化值,字段被删除将不设置。
相关注意事项:
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。