为什么XMLEncoder错过了一个属性?

时间:2013-08-09 20:49:59

标签: java serialization

我有这个java类

class Go {

  public boolean isSha1() {
    return true;
  }
  public String getSha1() {
    return this.sha1;
  }
  public String setSha1(String sha1) {
  }
  ...
}

当我尝试使用java的java.beans.XMLEncoder对其进行编码时,它会输出除 sha1之外的所有属性。这就像它正在跳过房产!

2 个答案:

答案 0 :(得分:3)

您没有遵循JavaBeans规范,因此不要指望它处理您的任意命名。

JavaBeans说,如果找到一对访问者void setX(Y)Y getX(),则X被识别为类型Y的读写属性。它的具体类型Y在两种情况下都是相同的。 (符号是我的,我只是想以具体的方式说明。)如果缺少getX()方法,X是一个只写属性。如果缺少setX(Y),则X是只读属性。

类型为boolean的属性需要特殊处理。如果有方法boolean isX(),它将用于对属性的读访问。如果有boolean getX()方法也可以,但不会被利用。

在您的代码中,默认内省会忽略setSha1(),因为它被称为set但不带参数。

但是,您已经给出了isSha1()getSha1()不同的返回类型,因此introspector无法判断sha1属性的类型应该是什么。此处的行为未由规范定义。您可以通过提供显式的bean描述符来解决这个问题,但没有人这样做。

所以,结果是,不要这样做。遵循规范中给出的约定。

答案 1 :(得分:0)

这是JDK中的错误与否(未知)但是现在的修复/解决方法是将isSha1重命名为其他东西。奇