Serializable:java默认序列化的功能,必须实现Serializable接口
实现Serializable 接口的类,虚拟机会默认添加一个ServialVersionUID 属性
1、SerialVersionUID默认值的计算:根据类的各个方面得来的(属性,方法等)
2、如果显示的声明此属性,虚拟机不会再添加
3、SerialVersionUID 如果不一致,反序列化会失败 (java.io.InvalidClassException)
最佳实践:一定要指定默认的SerialVersionUID 值,避免虚拟机添加!
举例:
public static class User implements Serializable{
private long id;
private String username;
private String password;
public User(){}
public User(String username,String password){
this.username = username;
//this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
这个User对象,没有默认的serialVersionUID 属性,反序列化的时候,如果新增了字段,就会反序列化失败!
如果改为如下则可以避免这个问题:
public static class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1811626210491983990L;
private long id;
private String username;
private String password;
public User(){}
public User(String username,String password){
this.username = username;
//this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}