JLink / java.io.ObjectInputStream.redObject[] - ClassNotFoundException
- To: mathgroup at smc.vnet.net
- Subject: [mg57608] JLink / java.io.ObjectInputStream.redObject[] - ClassNotFoundException
- From: Felix Kossak <felix.kossak at scch.at>
- Date: Thu, 2 Jun 2005 05:16:46 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi,
I have a little trouble with reading a Java object from file which I
have myself serialized before (from the Mathematica environment). It
works when I write a respective Java class by hand and execute it from
command line, but the same code does not work within Mathematica - it
produces a ClassNotFoundException.
Does anyone here have respective experience with serializing /
deserializing objects using J/Link?
The point seems to be that I use an extra Java library (WEKA), which
works perfectly for every other code I have tried so far, including
serializing, just not for deserializing. But it cannot be WEKA's fault
(as it works in another environment) - the class loader used in J/Link
seems to be the problem.
Here is some of the context and code:
-------------------------------------
InstallJava[
CommandLine -> "C:\\Program Files\\Java\\j2re1.4.2\\bin\\java.exe
-Xmx400m",
ClassPath -> ".;C:\\Program Files\\Weka\\Weka-3-4\\weka.jar"
];
(Weka 3.4 provides the extra Java library I use)
This, amongst others, works:
----------------------------
algorithm = JavaNew[
"weka.classifiers.functions.MultilayerPerceptron" ];
algorithm@buildClassifier[ wekaDataSet ];
...
os = JavaNew[
"java.io.FileOutputStream",
"C:\\work\\mlf_develop\\WEKA\\algorithm.mod"
];
oos = JavaNew[ "java.io.ObjectOutputStream", os ];
oos@writeObject[ algorithm ];
oos@flush[];
oos@close[];
This, however, fails:
=====================
fis = JavaNew[
"java.io.FileInputStream",
"C:\\work\\mlf_develop\\WEKA\\algorithm.mod"
];
ois = JavaNew[ "java.io.ObjectInputStream", fis ];
algin = ois@readObject[]
It produces the following error messages:
-----------------------------------------
Java::excptn: A Java exception occurred: java.lang.ClassNotFoundException: \
weka.classifiers.functions.MultilayerPerceptron
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.io.ObjectInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source).
$Failed
I also tried to instantiate the variable 'algin' before reading:
algin = JavaNew[ "weka.classifiers.functions.MultilayerPerceptron" ];
but that doesn't help either.
Thanks a lot for any help,
Felix