During network communication in JAVA, the objects to be transmitted at both ends of the communication program should not only be serialized, but also have the same class name and package name, object serialization

Source: Internet
Author: User

During network communication in JAVA, the objects to be transmitted at both ends of the communication program should not only be serialized, but also have the same class name and package name, object serialization

For example, the project directory is a simple QQ. When the client logs on, User information must be transmitted to the server for verification. Therefore, the User class objects are used at both ends, but at first, the package name on the Server was com. qq. server. common, the registration words at both ends are inconsistent, so the server end is stuck in the deserialization:
User user=(User)ois.readObject(); 

 

That is to say, the server receives the transmitted user object, but it cannot be parsed. There are two types of errors reported at the time. (although I knew where the problem was, I don't know why I reported different errors, I suddenly understood this confusion when I recorded it. I analyzed it at the bottom.) 1. In the first case, there were only Packages 1 and 2, and no packages 3, the following error is reported: (the Green Line marks the error code, that is, User user = (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. In the second case, Packages 1, 2, and 3 coexist. In this case, Packages 1 and 2 are used. Therefore, an error is returned, but the following error is reported, although the errors are the same, I still don't understand why ClassNotFoundException is reported above, and ClassCastException is reported below.
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)

  

Through the differences between the two errors, we also have a deeper understanding of serialization. Although we receive serialized objects transmitted over the network from outside, we want to reverse serialization, that is to say, to achieve the goal of completely local operations, the two ends of the communication must have the same class library (the complete name of the class includes the package name, so the package name must always be ). 1. The first error is that com. is not found locally. qq. common. user class (the error message is clear, and this error is thrown on the server. The VM is telling you: I didn't find this package on the Server, however, at that time, I ignored the "throwing the wrong location". I still thought that there was a com. qq. common. user class, why do you still throw such an error prompt? I think this is a project where the Server and Client are visually isolated, at that time, I didn't think about the idea of introducing packages. In the final analysis, I still had a poor understanding of serialization ). 2. After understanding 1 and serialization, it is easy to understand why the second error was reported, because the Server found com. qq. common. user, that is, the virtual machine can recognize the received object as com. qq. common. user, but cannot be deserialized to com. qq. server. common. user, that is to say, although the Server receives an Object, when the virtual machine performs a downward Transformation (at this time, it should be deserialized), the problem is found, that is, the Virtual Machine received a rabbit. Now you want it to "deserialize and transform down" into a cat. It does not know how to do it, so the error "ClassCastException" is reported.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.