Сериализация и RMI - PullRequest
0 голосов
/ 01 мая 2011

У меня следующая проблема:

class POJO implements Serializable{
    int[] a = new int[2];
    int b;
}

Сервер:

printThere(ArrayList<POJO> list) throws RemoteException{
    for(POJO obj:list)
      System.out.println(obj.a[0]+" "+obj.a[1]+" "+obj.b);\\<-----THERE LINE
}

Клиент:

main(){
    POJO o1 = new POJO();
    o1.a[0] =1;
    o1.a[1] =2;
    o1.b= 11;
    POJO o2 = new POJO();
    o2.a[0] =10;
    o2.a[1] =20;
    o2.b= 111;
    ArrayList<POJO> list = new ArrayList<POJO>();
    list.add(o1);
    list.add(o2);
    for(POJO obj:list)
        System.out.println(obj.a[0]+" "+obj.a[1]+" "+obj.b);\\<-----HERE LINE
    server = proxy.lookup("server");
    server.printThere(list);
}

Здесь строки печатаются следующим образом:

1 2 11  
10 20 111

Там строки печатаются следующим образом:

1 2 111  
10 20 111

Почему я теряю значение b в одном объекте?Я пытался использовать Vector<POJO> и POJO[] в удаленном методе, но получил тот же результат.

Ответы [ 2 ]

1 голос
/ 01 мая 2011

Я не вижу проблемы. Тем не менее, я думаю, вы сможете довольно быстро разобраться в этом. Вот мое предложение:

Постепенно опускайте фрагменты из вашей программы. После каждого шага запускайте код и смотрите, сохраняется ли проблема. Каждый такой «эксперимент» даст вам ценную информацию о причине проблемы. В конце концов вы захотите определить, какой элемент в вашем коде вызывает проблему. Вот несколько шагов по пути:

  • Возникает ли проблема, если вы удалите o2 из своего кода?
  • Возникает ли проблема, если вы создаете o2, но не добавляете его в list?
  • Возникает ли проблема при удалении поля a из класса POJO?
  • Возникает ли проблема при изменении a в массив из одного элемента (a = new int[1])?
  • Возникает ли проблема при изменении a из массива в (скажем) целое число?
  • Возникает ли проблема, если вы измените тип b с int на какой-нибудь другой примитив?
  • Возникает ли проблема, если вы измените тип b с типа int на какой-нибудь другой не примитивный тип (скажем, String или java.util.Date)?
  • Возникает ли проблема, если вы измените порядок o1 и o2 внутри списка (т.е. добавьте (o2), а затем добавьте (o1))?
  • Возникает ли проблема, если вы измените сигнатуру printThere () так, чтобы она принимала (скажем) параметр POJO (вместо одного ArrayList)?
  • Возникает ли проблема, если вы измените порядок полей в отпечатке (например, сначала напечатайте b, затем a [1], затем a [0])?
  • ...

Обычно, после применения нескольких таких шагов «преобразования», я собираю достаточно информации, чтобы определить основную причину. Вдобавок ко всему, я пытаюсь уменьшить объем. Если я обнаружил, что проблема возникает, даже если o2 опущен, тогда я держу ее подальше, перейдя к программе меньшего размера, которая более проста для понимания.

1 голос
/ 01 мая 2011

Я думаю, что значение b будет перезаписано.

попробуйте этот код:

POJO o1 = new POJO();
o1.a[0] =1;
o1.a[1] =2;
o1.b= 11;
POJO o2 = new POJO();
o2.a[0] =10;
o2.a[1] =20;
o2.b= 111;
...