序列化和RMI

时间:2011-05-01 06:28:19

标签: java serialization rmi

我有以下问题:

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 个答案:

答案 0 :(得分:1)

我认为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;

答案 1 :(得分:1)

我没有看到问题。也就是说,我认为你能够很快找到它的底部。这是我的建议:

逐渐省略程序中的部分内容。每个步骤后运行代码并查看问题是否仍然存在。每个这样的“实验”都会为您提供有关问题原因的宝贵详细信息。最终,您希望能够检测代码中的哪个元素导致问题。 以下是一些步骤:

  • 如果从代码中删除o2,是否会出现问题?
  • 如果您创建o2但未将其添加到list,是否会出现问题?
  • 如果从a课程中删除POJO字段,是否会出现问题?
  • 如果将a更改为单个元素数组(a = new int[1]),是否会出现问题?
  • 如果将a从数组更改为(比方说)整数,是否会出现问题?
  • 如果将b的类型从int更改为其他原语,是否会出现问题?
  • 如果将b的类型从int更改为其他非基本类型(例如:Stringjava.util.Date),是否会出现问题?
  • 如果更改列表中o1o2的顺序(即添加(o2)然后添加(o1)),是否会出现问题?
  • 如果更改printThere()的签名以使其(例如)更改为POJO参数(而不是单个ArrayList),是否会出现问题?
  • 如果更改打印中的字段顺序(例如,首先打印b,然后是[1],然后是[0]),是否会出现问题?
  • ...

通常,在应用了诸如此类的几个“转换”步骤之后,我会收集足够的信息来确定根本原因。最重要的是,我试图缩小范围。如果我发现即使o2被省略也会出现问题,那么我会把它保留下来,继续使用一个更容易理解的小程序。