java - 序列化和 RMI

标签 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[]在远程方法中但得到了相同的结果。

最佳答案

我没有看到问题。也就是说,我认为您很快就能弄清真相。这是我的建议:

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

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

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

关于java - 序列化和 RMI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5846870/

相关文章:

Java RMI - 我不明白为什么没有共享状态

java - 不确定这样做是否合适——从另一个端点调用 Spring 端点

java - jackson :防止序列化通过序列化 HashMap 获得的json字符串

jQuery UI Sortable - 单击按钮时保存顺序

java - 启动并运行 Java RMI

当导出某个对象时,JavaRMI 创建单个 ServerSocket?

java - 如何将 HashMap 类型转换为 WeakHashMap?

java - 在服务器端分析应用程序

Java 维吉尼亚密码

c# - 转换成base64会加一个回车符