
User user=(User)ois.readObject();也就是說server端收到了傳輸過來的user對象,但是無法解析,當時報的錯誤有兩種,(雖然當時知道了問題出在哪里,不知道為什么會報不同的錯誤,就在把這種迷惑記錄在案的時候突然似乎明白了,在最下面有分析)1、第一種情況是只有包1、2,沒有包3,報下面的錯誤:(綠色線標出的是出錯的代碼,即Useruser=(User)ois.readObject();)
java.lang.ClassNotFoundException: com.qq.common.User at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626) at java.io.ObjectInputStream.readNonPRoxyDesc(ObjectInputStream.java:1613) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) at com.qq.server.model.MyQQServer.<init>(MyQQServer.java:20) at com.qq.server.view.MyServerFrame.actionPerformed(MyServerFrame.java:37) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6525) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6290) at java.awt.Container.processEvent(Container.java:2234) at java.awt.Component.dispatchEventImpl(Component.java:4881) at java.awt.Container.dispatchEventImpl(Container.java:2292) at java.awt.Component.dispatchEvent(Component.java:4703) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462) at java.awt.Container.dispatchEventImpl(Container.java:2278) at java.awt.Window.dispatchEventImpl(Window.java:2750) at java.awt.Component.dispatchEvent(Component.java:4703) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.awt.EventQueue$4.run(EventQueue.java:729) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
2、第二種情況是1、2、3包共存,這時還是用的包1、2,所以肯定還是報錯的,但是卻報下面的錯,雖然出錯的地方是一樣的,但是一直沒搞懂為什么上面報的是ClassNotFoundException,而下面報ClassCastException。
java.lang.ClassCastException: com.qq.common.User cannot be cast to com.qq.server.common.User at com.qq.server.model.MyQQServer.<init>(MyQQServer.java:20) at com.qq.server.view.MyServerFrame.actionPerformed(MyServerFrame.java:37) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6525) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6290) at java.awt.Container.processEvent(Container.java:2234) at java.awt.Component.dispatchEventImpl(Component.java:4881) at java.awt.Container.dispatchEventImpl(Container.java:2292) at java.awt.Component.dispatchEvent(Component.java:4703) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462) at java.awt.Container.dispatchEventImpl(Container.java:2278) at java.awt.Window.dispatchEventImpl(Window.java:2750) at java.awt.Component.dispatchEvent(Component.java:4703) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.awt.EventQueue$4.run(EventQueue.java:729) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
通過這兩個錯誤的不同,也對序列化有了更深的認識,對于網(wǎng)絡中傳輸過來的序列化的對象,我們雖然是從外面接收過來的,但是要想逆序列化,也就是識別出來,達到像是完全在本地操作的目的,通信的兩端就要有完全一樣的類庫(類的完整名字是包括包的名字的,所以包名也得一直)。 1、上面第一個錯誤是因為,在本地沒有找到com.qq.common.User這個類(錯誤提示的很明了,而且這個錯誤是在server端拋出的,虛擬機在告訴你:我沒有在Server中找到這個包。但當時卻忽視了“拋錯地點”,當時還想呢,那不在Client端明明有一個com.qq.common.User類嗎,你為什么還拋出這樣的錯誤提示啊,竊以為這是在一個項目里,Server和Client端在視覺上的離得如此的近,當時就沒有在引包這個思路上想,歸根結(jié)底還是對序列化理解的不透徹啊)。 2、理解了1以及序列化,就很容易理解為什么會報上面第二個錯誤了,因為Server端在本地找到了com.qq.common.User,也就是說虛擬機能識別收到的對象是com.qq.common.User,但不允許逆序列化為com.qq.server.common.User,也就是說Server端雖然收到的是Object對象,但當虛擬機進行向下轉(zhuǎn)型的時候(此時應該會進行逆序列化),發(fā)現(xiàn)了問題,也就是說,虛擬機收到了一只兔子,你現(xiàn)在讓它“逆序列化并向下轉(zhuǎn)型”為一只貓,它不知道該怎么做了,所以報錯:ClassCastException。
新聞熱點
疑難解答