Java之 JDK 中的标志性接口 Serializable 原理(初学者)

标志性接口

前言

今天在搭框架时突然想到一个问题:我的 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);
        }
    }

关键点:

  1. 如果你是 String 类型的,写!
  2. 如果你是一个数组,写!
  3. 如果你是一个枚举类型,写!
  4. 如果你都不是,那只要你实现了 Serializable 接口,我也认!
  5. 如果你连这个接口都不实现,那没办法了,两个判断都给你抛出上面的 NotSerializableException 异常了。

这就是我以前继承个 AAA 屁颠屁颠跑去序列化惨遭当头棒喝的原因 ********

既然如此,举一反三,那么所有的流就一定有 Serializable 的身影存在!

后言

希望我们同代码一起携手共进,一起为自己的目标努力!!

由衷感谢您的观看,您的收获和支持就是我的最大动力!!再次感谢!!

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值