----------------------
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