I don't know if this will be helpful, but i quickly deconstructed the
AbstractIoBuffer code into a simple main method (from first google
result i found, note not even 2.0.1)
I am a little curious as to why the special serialization code is needed.
For example:
if (desc.forClass().isPrimitive()) {
write(0);
super.writeClassDescriptor(desc); // Note: this
super method appears to do a lot more than just write a name
} else {
write(1);
writeUTF(desc.getName());
}
I would also note that if you write your own handler on the client side
and create your own ObjectInputStream(from some bytes you read) that
unless you do the same thing
as below i'd imagine you'd run into some problems.
Potential suspect:
String className = readUTF();
System.out.println("readClassDescriptor
desc.name: " + className);
Class<?> clazz = Class.forName(className, true,
classLoader);
return ObjectStreamClass.lookup(clazz); //
returning null?
Anyway this simple test passes in my dev setup.
But may want to try it on android and/or
come up with another testcase that fails.
If you provided a concrete example may help (a simple java example).
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamClass;
import java.io.Serializable;
import java.io.StreamCorruptedException;
//
http://grepcode.com/file/repo1.maven.org/maven2/org.apache.mina/mina-core/2.0.0-M5/org/apache/mina/core/buffer/AbstractIoBuffer.java
public class ObjectStreamMain {
public static class Foo implements Serializable {
Class<Foo> clazz = Foo.class;
int i1;
int i2 = -1;
Integer i3 = null;
Integer i4 = 1;
Class<Foo>[] classArray = new Class[2];
{
classArray[0] = clazz;
classArray[1] = null;
}
String s = new String("X");
Foo[] fooArray1 = null;
}
public static void main(String[] args) {
final ClassLoader classLoader =
Thread.currentThread().getContextClassLoader();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
Foo o = new Foo(); // String o = new String("X");
try {
ObjectOutputStream out = new ObjectOutputStream(outStream) {
@Override
protected void writeClassDescriptor(ObjectStreamClass
desc) throws IOException {
System.out.println("writeClassDescriptor desc.name:
" + desc.getName());
if (desc.forClass().isPrimitive()) {
write(0);
super.writeClassDescriptor(desc);
} else {
write(1);
writeUTF(desc.getName());
}
}
};
out.writeObject(o);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
ByteArrayInputStream inStream = new
ByteArrayInputStream(outStream.toByteArray());
try {
ObjectInputStream in = new ObjectInputStream(inStream) {
@Override
protected ObjectStreamClass readClassDescriptor() throws
IOException, ClassNotFoundException {
int type = read();
if (type < 0) {
throw new EOFException();
}
switch (type) {
case 0: // Primitive types
return super.readClassDescriptor();
case 1: // Non-primitive types
String className = readUTF();
System.out.println("readClassDescriptor
desc.name: " + className);
Class<?> clazz = Class.forName(className, true,
classLoader);
return ObjectStreamClass.lookup(clazz);
default:
throw new StreamCorruptedException("Unexpected
class descriptor type: " + type);
}
}
@Override
protected Class<?> resolveClass(ObjectStreamClass desc)
throws IOException, ClassNotFoundException {
String name = desc.getName();
System.out.println("resolveClass desc.name: " +
desc.getName());
try {
return Class.forName(name, false, classLoader);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
return super.resolveClass(desc);
}
}
};
System.out.println(in.readObject());
} catch (Exception e) {
e.printStackTrace();
}
}
}
On 11/15/2010 10:06 AM, Mark Proctor wrote:
I'm using mina 2.0.1 and also receiving a NullPointerException during
serialization:
Caused by: java.lang.NullPointerException
at
org.apache.mina.core.buffer.AbstractIoBuffer$3.resolveClass(AbstractIoBuffer.java:1974)
at
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
at java.io.ObjectInputStream.readClass(ObjectInputStream.java:1462)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1312)
at
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
I found the object that was being marshalled has the following field:
private Class serviceInterface
If I set that to null it works, if it's set to an actual Class it
nullpointers. The line of code below is where desc is null:
at
org.apache.mina.core.buffer.AbstractIoBuffer$3.resolveClass(AbstractIoBuffer.java:1974)
protected Class<?> resolveClass(ObjectStreamClass desc)
throws IOException, ClassNotFoundException {
String name = desc.getName();
This would indicate that the object serialization protocol in mina does not
support Class as a field type. Is that right?
Mark
Jason Weinstein-3 wrote:
This is not much to work with, but i'd imagine that you didn't get the
full object back on the client.
Perhaps the server closed the connection before completing the write.
Did you flush after write?
Or perhaps you closed the client side prior to a full receive?
You may want to try a simple test case where you send a single object
like new String("X")
see what happens.
Also wonder what this source looks like
java.io.ObjectStreamField.resolve(ObjectStreamField.java:351)
as doesn't match up with my jdk.
FYI This is what the 2.0.1 Mina source looks like
235
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#235>
*while* (in.hasRemaining()) {
236
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#236>
*int* oldPos = in.position();
237
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#237>
238
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#238>
*try* {
239
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#239>
*synchronized* (decoderOut) {
240
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#240>
/// Call the decoder with the read bytes/
241
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#241>
decoder.decode(session, in, decoderOut);
242
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#242>
}
243
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#243>
244
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#244>
/// Finish decoding if no exception was thrown./
245
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#245>
decoderOut.flush(nextFilter, session);
246
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#246>
} *catch* (Throwable t) {
247
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#247>
ProtocolDecoderException
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolDecoderException.html>
pde;
248
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#248>
*if* (t instanceof ProtocolDecoderException) {
249
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#249>
pde = (ProtocolDecoderException) t;
250
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#250>
} *else* {
251
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#251>
pde = *new* ProtocolDecoderException
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolDecoderException.html>(t);
252
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#252>
}
253
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#253>
254
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#254>
*if* (pde.getHexdump() == *null*) {
255
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#255>
/// Generate a message hex dump/
256
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#256>
*int* curPos = in.position();
257
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#257>
in.position(oldPos);
258
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#258>
pde.setHexdump(in.getHexDump());
259
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#259>
in.position(curPos);
260
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#260>
}
261
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#261>
262
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#262>
/// Fire the exceptionCaught event./
263
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#263>
decoderOut.flush(nextFilter, session);
264
<http://mina.apache.org/report/trunk/xref/org/apache/mina/filter/codec/ProtocolCodecFilter.html#264>
nextFilter.exceptionCaught(session, pde);
On 11/5/2010 3:18 AM, matus wrote:
Hi,
I am creating a simple Android app for reading user tasks from server
using
Apache Mina.
When tested with Java Swing client everything works fine.On Android
however,
a run into ia problem.
The client connects ok, but after I get A protocolDecoderException when
receiveing message from server.
I am using Mina 2.0.1 stable
I am using Objectserialization codec:
acceptor.getFilterChain().addLast( "codec",
new ProtocolCodecFilter( new
ObjectSerializationCodecFactory() ) );
In client handler a get the ProtocolDecoderException:
java.lang.NullPointerException (Hexdump follows
Note; after conversion the hex dump contains this:
¸¬í sr org.jbpm.task.service.Commandxp sr java.util.ArrayListxp w
sq
~ w
xx~r !org.jbpm.task.service.CommandNamexr java.lang.Enumxpt
QueryTaskSummaryResponse
Full error listing bellow:
Thanks a lot for any advice
Regards Matus
11-05 10:06:25.658: INFO/System.out(1801): [2010:11:309
10:11:515:exception]
Uncaught exception on client
11-05 10:06:25.658: INFO/System.out(1801):
org.apache.mina.filter.codec.ProtocolDecoderException:
java.lang.NullPointerException (Hexdump: 00 00 01 7F AC ED 00 05 73 72 01
00
1D 6F 72 67 2E 6A 62 70 6D 2E 74 61 73 6B 2E 73 65 72 76 69 63 65 2E 43
6F
6D 6D 61 6E 64 78 70 00 00 00 00 73 72 01 00 13 6A 61 76 61 2E 75 74 69
6C
2E 41 72 72 61 79 4C 69 73 74 78 70 00 00 00 01 77 04 00 00 00 01 73 71
00
7E 00 02 00 00 00 01 77 04 00 00 00 0A 73 72 01 00 1F 6F 72 67 2E 6A 62
70
6D 2E 74 61 73 6B 2E 71 75 65 72 79 2E 54 61 73 6B 53 75 6D 6D 61 72 79
78
70 77 9E 00 00 00 00 00 00 00 01 01 00 16 50 65 72 66 6F 72 6D 61 6E 63
65
20 45 76 61 6C 75 61 74 69 6F 6E 01 00 22 50 6C 65 61 73 65 20 70 65 72
66
6F 72 6D 20 61 20 73 65 6C 66 2D 65 76 61 6C 75 74 61 74 69 6F 6E 2E 01
00
22 50 6C 65 61 73 65 20 70 65 72 66 6F 72 6D 20 61 20 73 65 6C 66 2D 65
76
61 6C 75 74 61 74 69 6F 6E 2E 01 00 08 52 65 73 65 72 76 65 64 00 00 00
00
00 01 00 05 6B 72 69 73 76 01 00 05 6B 72 69 73 76 01 00 00 01 2C 1B 7F
28
78 01 00 00 01 2C 1B 7F 28 78 00 78 78 78 7E 72 01 00 21 6F 72 67 2E 6A
62
70 6D 2E 74 61 73 6B 2E 73 65 72 76 69 63 65 2E 43 6F 6D 6D 61 6E 64 4E
61
6D 65 78 72 01 00 0E 6A 61 76 61 2E 6C 61 6E 67 2E 45 6E 75 6D 78 70 74
00
18 51 75 65 72 79 54 61 73 6B 53 75 6D 6D 61 72 79 52 65 73 70 6F 6E 73
65)
11-05 10:06:25.679: INFO/System.out(1801): at
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:251)
11-05 10:06:25.701: INFO/System.out(1801): at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
11-05 10:06:25.720: INFO/System.out(1801): at
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
11-05 10:06:25.720: INFO/System.out(1801): at
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
11-05 10:06:25.798: INFO/System.out(1801): at
org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:119)
11-05 10:06:25.798: INFO/System.out(1801): at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
11-05 10:06:25.798: INFO/System.out(1801): at
org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:426)
11-05 10:06:25.798: INFO/System.out(1801): at
org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:692)
11-05 10:06:25.798: INFO/System.out(1801): at
org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:645)
11-05 10:06:25.798: INFO/System.out(1801): at
org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:634)
11-05 10:06:25.798: INFO/System.out(1801): at
org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:66)
11-05 10:06:25.798: INFO/System.out(1801): at
org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1078)
11-05 10:06:25.857: INFO/System.out(1801): at
org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
11-05 10:06:25.859: INFO/System.out(1801): at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
11-05 10:06:25.859: INFO/System.out(1801): at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
11-05 10:06:25.859: INFO/System.out(1801): at
java.lang.Thread.run(Thread.java:1096)
11-05 10:06:25.859: INFO/System.out(1801): Caused by:
java.lang.NullPointerException
11-05 10:06:25.879: INFO/System.out(1801): at
java.io.ObjectStreamField.resolve(ObjectStreamField.java:351)
11-05 10:06:25.879: INFO/System.out(1801): at
java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1863)
11-05 10:06:25.879: INFO/System.out(1801): at
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:826)
11-05 10:06:25.879: INFO/System.out(1801): at
java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2066)
11-05 10:06:25.879: INFO/System.out(1801): at
java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:929)
11-05 10:06:25.879: INFO/System.out(1801): at
java.io.ObjectInputStream.readObject(ObjectInputStream.java:2285)
11-05 10:06:25.879: INFO/System.out(1801): at
java.io.ObjectInputStream.readObject(ObjectInputStream.java:2240)
11-05 10:06:25.879: INFO/System.out(1801): at
org.apache.mina.core.buffer.AbstractIoBuffer.getObject(AbstractIoBuffer.java:1982)
11-05 10:06:25.879: INFO/System.out(1801): at
org.apache.mina.filter.codec.serialization.ObjectSerializationDecoder.doDecode(ObjectSerializationDecoder.java:92)
11-05 10:06:25.879: INFO/System.out(1801): at
org.apache.mina.filter.codec.CumulativeProtocolDecoder.decode(CumulativeProtocolDecoder.java:178)
11-05 10:06:25.879: INFO/System.out(1801): at
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:241)
11-05 10:06:25.909: INFO/System.out(1801): ... 15 more