It explodes in readLong_slow. I took a close look at that method again, and it looks ok except it should be require(count+1) and not require(count). This won't fix your problem, it will only tell you "buffer underflow" instead of ArrayIndexOutOfBounds. Otherwise the method checks out and should be working properly for all input.
KryoNet message bytes are a length, then class id, then serialized bytes. It doesn't attempt deserialization until all the bytes are ready. The only limit is the size of the buffers.
Note if you send a LOT of data very rapidly, KryoNet will buffer it up and you won't be able to send other data until that goes through. You could break your data into smaller pieces and use TcpIdleSender to send a piece only when the connection is idle, so you can still send other data. This also has the benefit of not needing a large write buffer.
Your problem is probably that bytes got mangled somehow, classes are registered with Kryo differently on the client/server, or an error in deserialization not matching up to serialization. Debugging it is a pain, sorry.
You could edit the server so that after it serializes an object, it deserializes those bytes before sending them. If deserialization fails there, we've narrowed it down to a bug in Kryo serialization. If so, write out the bytes to a file to make a simpler test case.
You could capture the actual bytes on your client. For that, breakpoint on ArrayIndexOutOfBounds on the client then cause the failure. Go up the stacktrace to TCPConnection#readObject, where it calls KryoSerialization#read. Write the bytes from readBuffer to a file, starting at startPosition and ending at startPosition + length. Easy way to do this is with the debugger stopped and the TCPConnection#readObject stack frame selected, paste the following code anywhere, select the code, right click and choose Execute.
java.io.FileOutputStream output = new java.io.FileOutputStream("fubar");
for (int i = startPosition; i < startPosition + length; i++)
output.write(readBuffer.get(i));
Now you should be able to write a simpler test using just Kryo to deserialize the bytes from that file. Code to do that looks like:
Kryo kryo = new Kryo();
// Configure Kryo here.
Object object = kryo.readClassAndObject(new Input(new FileInputStream("fubar")));
System.out.println(object);
Most likely it will fail. Send me the file and the classes and Java code you use to configure Kryo and I'll look at fixing it, or you can debug it from there. Coming up with a simpler test case may be difficult.
-Nate