粗体与JRockit兼容性
问题描述:
有人在JRockit VM上运行hessian时遇到此异常吗?粗体与JRockit兼容性
Caused by: java.lang.ArrayIndexOutOfBoundsException: -418
at com.caucho.hessian.util.IdentityIntMap.put(IdentityIntMap.java:141)
at com.caucho.hessian.io.Hessian2Output.addRef(Hessian2Output.java:1285)
at com.caucho.hessian.io.UnsafeSerializer.writeObject(UnsafeSerializer.java:157)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:421)
at com.caucho.hessian.io.CollectionSerializer.writeObject(CollectionSerializer.java:102)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:421)
at com.caucho.hessian.io.UnsafeSerializer$ObjectFieldSerializer.serialize(UnsafeSerializer.java:293)
... 34 more
我花了一个星期只上解决此问题,找出麻袋正常工作与HotSpot虚拟机,但始终未能序列化使用的JRockit VM特定对象。我实际上想出了一个简单的修复方法,但它需要修改IdentityIntMap.java代码并更新hessian jar文件。
答
这是我想出的修复。我无法弄清楚如何通知Hessian代码的维护者,所以我在这里发布它。修改文件:
com.caucho.hessian.util.IdentityIntMap.java起始于线112:
public final int get(Object key)
{
int prime = _prime;
// int hash = System.identityHashCode(key) % prime;
int hash = System.identityHashCode(key);
// JRockit VMs can return a negative number which will cause this method to throw an exception
if (hash < 0)
hash = -hash;
hash = hash % prime;
...
而且改变在下一方法的代码起始于线135:
public final int put(Object key, int value, boolean isReplace)
{
int prime = _prime;
// int hash = System.identityHashCode(key) % prime;
int hash = System.identityHashCode(key);
// JRockit VMs can return a negative number which will cause this method to throw an exception
if (hash < 0)
hash = -hash;
hash = hash % prime;
...
如果您有修复,请把它张贴在这里(作为答案),以便人们可以找到它。 – nfechner 2012-01-17 15:17:08