Гессиан с совместимостью с JRockit - PullRequest
2 голосов
/ 17 января 2012

Кто-нибудь сталкивался с этим исключением при запуске гессиана на виртуальной машине 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

Я потратил больше недели на устранение этой проблемы, только чтобы выяснить, что hessian отлично работает с виртуальной машиной HotSpot, но постоянно не может сериализовать определенные объекты с помощью виртуальной машины JRockit.На самом деле я предложил простое исправление, но для этого потребовалось изменить код IdentityIntMap.java и обновить файл гессианского jar-файла.

1 Ответ

1 голос
/ 22 февраля 2012

Вот исправление, которое я придумал. Я не мог понять, как уведомить сопровождающих о гессенском коде, поэтому я публикую его здесь. Изменить файл:

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;
  ...
...