java中的序列化

本文深入探讨Java序列化概念及其在数据持久化和远程通信中的应用。详细介绍了序列化与反序列化的实现方式,包括实现Serializable接口、自定义writeObject和readObject方法以及使用Externalizable接口。同时,阐述了序列化注意事项,如反序列化顺序、transient属性处理和静态属性不被实例化等。

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

java中的序列化:

	1)概念:	
		序列化:把java对象转换为字节序列的过程。
		反序列化:把字节序列恢复为Java对象的过程。
	
	
	2)作用:
		数据的持久化。
		进行远程通信(即:在网络上传送对象的字节序列)
		
		
	3)实现:要序列化的类必须实现Serializable接口:
		
		1)若类实现了Serializable接口:
		
			使用ObjectOutputStream的writeObject(Object obj)方法来实现序列化,使用ObjectInputStream的readObject()方法来实现反序列化。
			
			举例:
				// 序列化
				Person person1 = new Person("jack", 17);
				Person person2 = new Person("jack", 18);				
				File file = new File("D:\\test\\Person.txt");
				FileOutputStream fos = new FileOutputStream(file);
				ObjectOutputStream oos = new ObjectOutputStream(fos);
				oos.writeObject(person1); 	// 注:若Person未实现Serializable接口,则writeObject(Object obj)方法会报java.io.NotSerializableException的错误。
				oos.writeObject(person2);
				oos.close();
				fos.close();

				// 反序列化		
				FileInputStream fis = new FileInputStream(file);
				ObjectInputStream ois = new ObjectInputStream(fis);
				Person person11 = (Person) ois.readObject();
				Person person22 = (Person) ois.readObject();
				ois.close();
				fis.close();
				
		
		2)若类实现了Serializable接口,且定义了writeObject方法和readObject方法:
		
			使用类自己定义的writeObject(java.io.ObjectOutputStream s)方法 和 readObject(java.io.ObjectInputStream s)方法 来实现序列化和反序列化。
			
			举例:ArrayList类
		
		3)若类实现了Externalizable接口:
		
			使用类实现的writeExternal(ObjectOutput out) 和 readExternal(ObjectInput in) 方法来实现序列化和反序列化。
			
			说明:Externalizable接口继承了Serializable接口,Externalizable接口定义了两个方法:writeExternal(ObjectOutput out) 和 readExternal(ObjectInput in)
		
		
		
	4)注意:
		1)反序列化的顺序一定要和序列化的顺序相同。
		
		2)类中被transient关键字修饰的属性不会被序列化。
			说明:若类实现了Externalizable接口,那么transient修饰的属性是否可以序列化取决于该类自定义的writeExternal和readExternal方法的实现。
			
		3)类中的静态属性不会被实例化。
		
		4)类中如果未显式声明静态属性serialVersionUID,那么在序列化时将基于该类的各个方面计算该类的默认serialVersionUID值。尽管如此,我们还是强烈建议所有可序列化的类都显式声明serialVersionUID 值,且serialVersionUID建议声明为private的。
			说明:
				1>计算默认的serialVersionUID对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的InvalidClassException。
				2>数组类不能声明一个明确的serialVersionUID,因此它们总是具有默认的计算值,但是数组类没有匹配 serialVersionUID 值的要求。	
		
		
		
		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值