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 值的要求。

猜你喜欢

转载自my.oschina.net/u/1399755/blog/1820881
今日推荐