`

Serializable

阅读更多

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);
		}
		
	}

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics