国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

JAVA 中進行網(wǎng)絡通信時,通信的程序兩端要傳輸?shù)膶ο螅粌H要序列化,而且這個對象所屬的類的名字要完全一樣,連包的名字都得一樣

2019-11-15 00:54:23
字體:
供稿:網(wǎng)友
java 中進行網(wǎng)絡通信時,通信的程序兩端要傳輸?shù)膶ο螅粌H要序列化,而且這個對象所屬的類的名字要完全一樣,連包的名字都得一樣

  如上圖項目目錄,這是一個簡易的QQ,客戶端登錄的時候要傳輸用戶信息到服務器驗證,所以兩端都會用到User類的對象,但一開始我在Server端的包名是com.qq.server.common,兩端的報名字不一致,所以server端卡在了逆序列化那里:
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。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 凤城市| 新余市| 永德县| 来宾市| 沾益县| 屯门区| 高密市| 丹阳市| 定西市| 大渡口区| 宜阳县| 新兴县| 木里| 泰和县| 南投市| 绍兴市| 望都县| 仲巴县| 叙永县| 青田县| 彰武县| 富平县| 黎平县| 苍梧县| 比如县| 丹巴县| 东丽区| 古蔺县| 鄂托克前旗| 铜鼓县| 房山区| 临沧市| 阿勒泰市| 五大连池市| 清新县| 安岳县| 阿拉善右旗| 化德县| 顺义区| 盱眙县| 巴中市|