java代码中的java.io.NotSerializableException?

时间:2015-01-23 10:12:16

标签: java serialization

我有一个类,其中所有的内部类都是这样的

public class BaseClass{
.......
......
.......
public class AccountPaymentDetailBean implements Serializable {
//inner class 
}

}

但我得到的是异常

  

java.io.NotSerializableException:com.core.shi.core.folder.BaseClass $ 5     在   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)     在   java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)     在   java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)     在   java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)     在   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)     在   java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)     在   java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)     在   java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)     在   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)     在   java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)     在org.zkoss.zk.ui.AbstractPage.writeObject(AbstractPage.java:232)     在sun.reflect.GeneratedMethodAccessor124.invoke(未知来源)at   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:601)at   java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)     在   java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)     在   java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)     在   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)     在   java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)     在java.util.LinkedList.writeObject(LinkedList.java:1118)at   sun.reflect.GeneratedMethodAccessor25.invoke(未知来源)at   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:601)at   java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)     在   java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)     在   java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)     在   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)     在   java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)     在   java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:438)     在   org.zkoss.zk.ui.impl.DesktopImpl.writeObject(DesktopImpl.java:1044)     在sun.reflect.GeneratedMethodAccessor118.invoke(未知来源)at   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:601)at   java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)     在   java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)     在   java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)     在   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)     在   java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)     在   java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)     在   java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)     在   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)     在   java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)     在java.util.HashMap.writeObject(HashMap.java:1100)at   sun.reflect.GeneratedMethodAccessor24.invoke(未知来源)at   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:601)at   java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)     在   java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)     在   java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)     在   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)     在   java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)     在   java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:438)     在org.zkoss.util.CacheMap.writeObject(CacheMap.java:633)at   sun.reflect.GeneratedMethodAccessor112.invoke(未知来源)at   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:601)at   java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)     在   java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)     在   java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)     在   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)     在   java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)     在   java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)     在   java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)     在   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)     在   java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)     在   org.zkoss.zk.ui.http.SimpleSession.writeThis(SimpleSession.java:433)     在   org.zkoss.zk.ui.http.SerializableSession.writeObject(SerializableSession.java:71)     在sun.reflect.GeneratedMethodAccessor111.invoke(未知来源)at   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:601)at   java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)     在   java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)     在   java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)     在   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)     在   java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)     在   com.csdcsystems.amanda.servlet.AmandaSessionFilter.sizeof(AmandaSessionFilter.java:88)     在   com.csdcsystems.amanda.servlet.AmandaSessionFilter.testSerializability(AmandaSessionFilter.java:73)     在   com.csdcsystems.amanda.servlet.AmandaSessionFilter.doFilter(AmandaSessionFilter.java:55)     在   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)     在   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)     在   org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)     在   org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)     在   org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)     在   org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)     在   org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)     在   org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)     在   org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)     在   org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)     在   org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)     在   org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:607)     在   org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:316)     在   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)     在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:615)     在   org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)     在java.lang.Thread.run(Thread.java:722)

有人可以告诉我 BaseClass $ 5 的含义是什么?这个例外的确切含义是什么?

3 个答案:

答案 0 :(得分:1)

Q2)这个例外到底是什么意思?
内部类不应该实现Serializable。它们使用编译器生成的合成字段来存储对封闭实例的引用,并存储来自封闭范围的局部变量的值。
内部类的默认序列化形式是未定义的。但是,静态成员类可以实现Serializable。

更多信息here.

Q1)有人可以告诉我BaseClass $ 5的含义是什么吗?
没有更多细节。 BAseClass $ 5表示这个例外发生在这个类中。

答案 1 :(得分:1)

  

有人可以告诉我BaseClass $ 5的含义是什么吗?

BaseClass中定义的第五个匿名内部类。

为匿名内部类分配一个等于封闭类型的自动名称,加上一个美元符号和一个序数。在您的示例中:“BaseClass”+“$”+“5”。

  

这个例外的确切含义是什么?

  • 显然您使用的框架正在测试HTTP会话的可序列化(com.csdcsystems.amanda.servlet.AmandaSessionFilter.testSerializability
  • 您的会话(类型org.zkoss.zk.ui.http.SerializableSession)似乎内部定义了匿名BaseClass$5
  • 会话中的每个对象都必须是可序列化的,这就是您收到此错误的原因。

答案 2 :(得分:0)

Q1)有人可以告诉我BaseClass $ 5的含义是什么吗?   有时候,内部类没有名字。    在你的情况下它有一个名字。   我们直接创建一个类(例如接口的实现者)并给出实现,并用:)完成它的情况;然后  该类没有名称。 那么JVM如何为那个???创建一个.class文件呢?    - 答案是$命名约定。   所以这些类被创建为BaseClass $ 1,BaseClass $ 2 ......等等。

必须至少有5个这样的内部非名字类 - 检查你的课程 - 哪一个获得哪个数字? - > 我认为纯粹依赖于序列。 例如 - clickListener纯粹是虚构的,例如我试图展示......

public class myclass{
    public void mymethod(){
          this.addClickListener(new ClickListener(){
               public void click(){
                   S.O.P("Clicked !!!");
               }
          });
    }
}

因此实现CLickListener被编译为 - >  MyClass的$ 1.class