Serializable

本文深入探讨Java中序列化的实现方式及最佳实践,重点讲解Serializable接口的作用及其带来的问题,并通过实例说明如何正确设置serialVersionUID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值