【问题标题】:Serialization and RMI序列化和 RMI
【发布时间】:2011-05-01 06:28:19
【问题描述】:

我有以下问题:

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&lt;POJO&gt;POJO[],但得到了相同的结果。

【问题讨论】:

  • 你确定你仍然向我们展示了正确的东西吗?症状就像你有 @t_motchy 的原始错字一样

标签: java serialization rmi


【解决方案1】:

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

逐渐从你的程序中省略一些片段。在每个步骤之后运行代码并查看问题是否仍然存在。每个这样的“实验”都会为您提供有关问题原因的有价值的详细信息。最终,您希望能够检测代码中的哪个元素导致了问题。 以下是沿途需要采取的一些步骤:

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

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

【讨论】:

  • 我没有发送 POJO 对象列表,而是尝试通过远程方法发送 POJO 对象,然后在服务器上创建列表……这对我有用……但如果我的对象是可序列化的,不是说这些对象的List也是可序列化的吗?
  • 是的,如果对象是可序列化的,那么列表也应该是可序列化的。如果您想深入了解这个问题,我建议您进行更多实验(从上面发布的列表中),直到找到根本原因
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2011-09-21
    • 2013-11-13
    • 2011-09-10
    • 1970-01-01
    • 2014-09-08
    • 2022-07-01
    • 1970-01-01
    相关资源
    最近更新 更多