前言
今天在搭框架时突然想到一个问题:我的 BaseController,BaseService,BaseDao 里面没有东西,而我以后的三层都要继承他,那 JDK 里的那些只有一对括号的接口是不是也是在 JDK 里面竖个标而已呢?
换句话说,是不是这类接口本身的意义就是给 JDK 里的其他方法使用的?
于是我就想到以前揍 SE 的时候遇到的问题:为什么我实现了自定义的大括号接口去序列化,他报 NotSerializableException (未序列化异常) 呢?
干代码
想到序列化一般是用来读写文件的,我就去输出流堆里翻了半天,终于让我翻到了有关于 Serializable 写文件的方法实现。这个方法名叫 writeObject0 ,在 ObjectOutputStream 类的第 1105 行
这也是为什么要实现了这个接口才能被序列化的原因。
private void writeObject0(Object obj, boolean unshared)
throws IOException
{
boolean oldMode = bout.setBlockDataMode(false);
depth++;
try {
//...
Class<?> cl = obj.getClass();
ObjectStreamClass desc;
// 巴拉巴拉到 1170 行
// 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());
}
}
} finally {
depth--;
bout.setBlockDataMode(oldMode);
}
}
关键点:
- 如果你是 String 类型的,写!
- 如果你是一个数组,写!
- 如果你是一个枚举类型,写!
- 如果你都不是,那只要你实现了 Serializable 接口,我也认!
- 如果你连这个接口都不实现,那没办法了,两个判断都给你抛出上面的 NotSerializableException 异常了。
这就是我以前继承个 AAA 屁颠屁颠跑去序列化惨遭当头棒喝的原因 ********
既然如此,举一反三,那么所有的流就一定有 Serializable 的身影存在!
后言
希望我们同代码一起携手共进,一起为自己的目标努力!!
由衷感谢您的观看,您的收获和支持就是我的最大动力!!再次感谢!!