今天和同事联调一个接口,抛未序列化异常。异常直接指向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。