自定义序列化过程
可以对序列化的过程进行定制,进行更细粒度的控制,思路是在业务模型中添加 readObject 和 writeObject方法
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* 自定义序列化
* @author 多多
*
*/
public class Person2 implements Serializable{
private static final long serialVersionUID=1L;
private String name;
private transient int age;
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
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;
}
public String toString() {
return "Name:"+name+";age:"+age+";num:"+num;
}
//写操作
private void writeObject(ObjectOutputStream os) {
try {
os.defaultWriteObject();
os.writeObject(this.age);
System.out.println(this);
System.out.println("序列化成功");
}catch(Exception ex) {
ex.printStackTrace();
}
}
//读操作
private void readObject(ObjectInputStream is ) {
try {
is.defaultReadObject();
this.setAge((Integer)is.readObject()-1);
System.out.println("反序列化成功");
System.out.println(this);
}catch(Exception ex) {
ex.printStackTrace();
}
}
public static void main(String [] args) {
Person2 p2=new Person2();
p2.setNum(90);
p2.setName("maomao");
p2.setAge(22);
try {
FileOutputStream fos=new FileOutputStream("D:\\Java\\demo\\day321\\p3.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(p2);
fos.close();
oos.close();
}catch(Exception ex) {
ex.printStackTrace();
}
}
}
注 : readObject 和 writeObject方法,它们都是 private的,接受的参数是 ObjectStream,然后在方法体内调用了defaultReadObject或者defaultWriteObject方法
这里age同样是transient的,但是在保存对象的过程中,单独对其进行保存,在读取时,将age信息读取出来,并进行减1处理
public static void main(String [] args) {
//读取序列化文件---恢复对象
try {
FileInputStream fis=new FileInputStream("D:\\Java\\demo\\day321\\p3.txt");
ObjectInputStream ois=new ObjectInputStream(fis);
Person2 p2=(Person2) ois.readObject();
System.out.println(p2);
fis.close();
ois.close();
}catch(Exception ex) {
ex.printStackTrace();
}
注 : 通过结果可以观察出,使用自定义序列化过程会忽略 transient 关键字的影响,这点和 Externalizable 接口 有些类似
![](//img-blog.csdn.net/20180321200757397?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L2R1b2R1bzE4dXA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](//img-blog.csdn.net/20180321201615449?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L2R1b2R1bzE4dXA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)