java.io.NotSerializableException: java.util.ArrayList$SubList

来源:互联网 发布:小众app 知乎 编辑:程序博客网 时间:2024/06/05 21:06

  今天和同事联调一个接口,抛未序列化异常。异常直接指向List类,我的第一反应是List的泛型类没有实现Serializable。

Caused by: java.io.NotSerializableException: java.util.ArrayList$SubList  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)  at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)  at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)  at com.taobao.hsf.remoting.serialize.JavaEncoder.encode(JavaEncoder.java:17)  at com.taobao.hsf.remoting.util.RemotingUtil.convert2RpcRequest(RemotingUtil.java:192)  at com.taobao.hsf.remoting.EnumRemotingType$1.convertRequest(EnumRemotingType.java:24)  at com.taobao.hsf.remoting.client.AbstractClient.futureInvoke(AbstractClient.java:58)  at com.taobao.hsf.remoting.invoke.component.SyncInvokeComponent.invoke(SyncInvokeComponent.java:53)

  检查RPC接口的返回的类和它的字段,都是实现了序列化接口的。查看SubList的继承关系图。原来是SubList没有实现序列化接口。
这里写图片描述

  写段代码测试一下:

    @Test    public void test() {        ArrayList list = new ArrayList();        list.add(1);        list.add(1);        list.add(1);        List subList = list.subList(0, 1);        if(subList instanceof java.io.Serializable) {            System.out.println(subList.getClass().getName() + " implement serializable");        } else  {            System.out.println(subList.getClass().getName() + " does not implement serializable");        }    }

输出

java.util.ArrayList$SubList does not implement serializable

  并不是所有的未序列化异常都是自己写的类没实现 serializable接口导致的,也有可能是自己天天用的jdk。