我在反序列化对象时遇到了问题。当前项目具有插件风格的架构,因此我有包含在运行时加载的类文件的jar。我无法反序列化包含在其中一个jar中找到的类的对象,因此我编写了一个快速测试方法,该方法被称为mid-stream,它刚刚加载插件,实例化正确的方法(该对象实现了一个特定的接口,因此我可以通过. isAssignableFrom(…)识别它),序列化它(这很好),然后立即尝试反序列化它。
我仍然得到一个“ClassNotFoundException”。
堆栈跟踪:
Jul 21, 2014 4:02:11 PM com.newspinrobotics.auth.MainFrame loadPlugins
SEVERE: null
java.lang.ClassNotFoundException: com.newspinrobotics.auth.plugin.tcpserver.TCPServer
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:625)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at com.newspinrobotics.auth.MainFrame.loadPlugins(MainFrame.java:79)
at com.newspinrobotics.auth.MainFrame.<init>(MainFrame.java:43)
at com.newspinrobotics.auth.MainFrame$6.run(MainFrame.java:539)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
现在,在你问之前。TCPServer类中没有不可序列化的字段。它有字符串和原语。有一个字段不属于这些类别,但它被标记为瞬态。甚至还有一个no-arg构造函数(尽管不需要,对吗?)。是的,它实现了Serializable(序列化很好)。
我很困惑类加载器怎么可能没有它,因为它在反序列化对象之前只实例化了几行对象。
我确实使用定制的ClassLoader(扩展URLClassLoader)在运行时加载jar文件。
我确实提供了一个公共静态最终长序列VersionUID=XXXXXXXL;字段。
编辑:
我指的Class loader扩展了URLClassLoader。它位于另一个人编写的实用程序类中,经过进一步检查,实际上甚至不是真正的修改(出于某种原因,他觉得想要扩展它,而不是对它做任何实质性的事情)。该实用程序所做的只是分离jar文件,并使用URLClassLoader通过addURL(…)将jar文件添加到URLClassLoader中,并通过loadClass(…)加载类。所以这个实用程序中似乎没有任何邪恶的东西。然而,我不是ClassLoader忍者,所以如果需要,我当然可以提供更多信息。它实际上只是一些用于加载Jar文件和挑选类文件并加载它们的实用程序函数。
帮帮我StackOverflow,你是我唯一的希望(也许)。
您是否将ObjectInputStream
子类化以覆盖resloadClass()
以使用您的自定义Classloader
?(有关其他人这样做的示例,尽管不是对您问题的直接回答,请参阅ObjectInputStream自定义类加载器反序列化问题:未调用resloclass()。)