黑马程序员-----IO之对象序列化Externalizable与序列号

时间:2023-02-18 15:06:11
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

1.Externalizable
Java还提供了另一种序列化机制——实现Externalizable接口,这种序列化方式完全由程序员决定存储和恢复对象数据。
该接口里定义了两个方法:

void readExternal(ObjectInput in):需要序列化的类实现readExternal方法来实现反序列化。该方法调用DataInput的方法来恢复基本类型的属性值,调用ObjectInput的readObject方法来恢复引用类型的属性值。
void writeExternal(ObjectOutput out):需要序列化的类实现writeExternal方法来保存对象的状态。该方法调用DataInput的方法来保存基本类型的属性值,调用ObjectOutput的writeObject方法来保存引用类型的属性值。

下面Person类实现类Externalizable接口,并且实现了该接口里提供的两个方法,用以实现自定义序列化。
public class Person implements Externalizable{

	//属性
	private String name;
	private int age;
	
	//构造器
	Person(){}
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	//setter和getter方法
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	//实现Externalizable接口的方法
	public void writeExternal(ObjectOutput out) throws IOException{
		out.writeObject(new StringBuffer(name).reverse());
		out.writeInt(age);
	}
	
	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
		this.name = ((StringBuffer)in.readObject()).reverse().toString();
		this.age = in.readInt();
	}
	
}


2.版本,序列号
反序列化Java对象时必须提供该对象的class文件,但随着项目的升级,系统的class文件也会升级,Java如何保证两个class文件的兼容性?
Java序列化机制允许为序列化类提供一个private static final修饰的serialVersionUID属性值,该属性值用于标识该Java类的序列化版本,如果一个类升级后,只要它的serialVersionUID属性值保持不变,序列化机制也会把它们当成同一个序列化版本。
public class Text {

	//为该类指定一个serialVersionUID属性值
	private static final long serialVersionUID = 512;
	
	...
}

为了在反序列化时确保序列化版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义。这样,即使在某个对象被序列化之后,它所对应类做出了修改,该对象依然可以被正确地反序列化。


3.序列化小结
1)对象的类名、属性(包括基本类型、数组、对其他对象的引用)都会被序列化;方法、static属性、transient属性都不会被序列化。
2)实现Serializable接口的类如果需要让某个属性不被序列化,可在该属性前加transient修饰符,而不是加static关键字。
3)保证序列化对象的属性的类型也是可序列化的,否则需要用transient关键字来修饰该属性,否则,该类是不可序列化的。
4)反序列化对象时必须有序列化对象的class文件。
5)当通过文件、网络来读取序列化后的对象时,必须按实际写入的顺序读取。


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net