不用加Serializable也能序列化了(反正标题党)
直接上正文,普通的序列化就不说了,先上代码
public class Test implements Serializable{
transient public Item item;
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
if (item == null) {
item = new Item();
}
out.writeObject(item.a);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
String a = (String) in.readObject();
item = new Item();
item.a = a;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
}
在加上transient 这个关键字之后, 如果还要进行序列化,那么必须得写write和read这两个钩子方法,不过Item这个类却可以不用实现Serializable接口。这是为什么呢
答案就是:写上Serializable标记接口,就是为了在ObjectOutputStream 中 writeObject(Object obj)这个方法中的通过一个判断语句
else if(obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
}
有了这个标记才能被写入流中,但是在我们上面的代码中,我们直接重写了write方法,因为我们重写了方法,所以在调用的时候会自动调用我们写的write方法,跳过了这个步骤,所以Item可以不用实现Serializable接口。
关于这个的思考可以去看看大神的公众号(里面讲的比我说的清晰多了)