一般情况下我们序列化都要实现Serializable接口,但Serializable是空的,即无属性,也无方法声明,空空如也。
但我们序列化的时候又为什么要实现它呢?
我们使用ObjectOutputStream类中writeObject方法将对象写出(硬盘或网络爱啥啥),writeObject又调用了ObjectOutputStream的私有方法writeObject0。
writeObject0的部分代码如下:
// remaining cases
if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum) obj, desc, unshared);
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "\n" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
以上可以看出,如果对象是String类型,Enum(枚举)类型,(这两个在类定义的时候已经实现了Serializable接口)或者实现了 Serializable接口,都是可以被实例化的,实现Serializable接口起到的就是一个标记作用。
当然writeObject0方法中还有各种检测代码什么的,有时间再详细看一下吧
如有错误,欢迎指正
end