Имах проблем с десериализацията на обект. Текущият проект има архитектура в стил плъгин, така че имам буркани, които съдържат клас файлове, които се зареждат по време на изпълнение. Не успях да десериализирам обект, който съдържа клас, който беше открит в един от тези буркани, така че написах метод за бърз тест, който се извиква по средата на потока, който току-що зареди плъгините, инстанцира правилния (обектът имплементира определен интерфейс така че мога да го идентифицирам чрез .isAssignableFrom(..)), сериализира го (което се случва добре) и след това веднага се опитва да го десериализира.
Все още получавам „ClassNotFoundException“.
Stacktrace:
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 няма полета, които не могат да бъдат сериализирани. В него има низове и примитиви. Има едно поле, което не попада в тези категории, но е маркирано като преходно. Има дори конструктор без аргумент (въпреки че това не е необходимо, нали?). И да, той прилага Serializable (сериализацията върви добре).
Объркан съм как е възможно програмата за зареждане на класове да НЕ го има, тъй като инстанцира обекта само няколко реда, преди да го десериализира.
Използвам специално създаден ClassLoader (разширява URLClassLoader), за да заредя jar файловете по време на изпълнение.
Предоставям публичен статичен окончателен дълъг serialVersionUID = XXXXXXXL; поле.
РЕДАКТИРАНЕ:
Class loader, за който имам предвид, разширява URLClassLoader. Намира се вътре в полезен клас, написан от друг човек, който при по-нататъшна проверка всъщност дори не е модификация (по някаква причина му се искаше да го разшири и да не прави нищо съществено за него). Всичко, което помощната програма прави, е да раздели jar файлове и да използва URLClassLoader, за да добави jar файловете в URLClassLoader чрез addURL(..) и също така да зареди класовете чрез loadClass(..). Така че не изглежда, че има нещо лошо в тази помощна програма. Аз обаче не съм нинджа на ClassLoader, така че със сигурност мога да дам допълнителна информация за това, ако е необходимо. Това всъщност са само няколко помощни функции за зареждане на Jar файлове и избиране на клас файлове и тяхното зареждане.
Помогнете ми StackOverflow, вие сте единствената ми надежда (може би).
ObjectInputStream
в коментарите към моя отговор не даде резултат, бих ви предложил да публикувате кода, където успешно инстанцииратеTCPServer
от вашия зареждащ клас, както и кода, където го десериализирате неуспешно отObjectInputStream
(включително кода, където създавате и конфигурирате тозиObjectInputStream
). Но се надяваме, че разширяването наObjectInputStream
ще бъде всичко, от което се нуждаете. - person Tim   schedule 22.07.2014