0

我正在使用带有注释的XStream在我的 Java 对象和 XML 之间进行传输。我本质上是在尝试使 XML 尽可能小,我想要减少的项目之一是在不需要时包含值。当一个值是我不想将它包含在我的 xml 中时,因为它的默认值也是 false。booleanbooleanfalse

是否可以将 XSream 配置为不包含等于默认值的值?

鉴于:

public class Test {

    @XStreamAlias("name")
    @XStreamAsAttribute
    private String name;

    @XStreamAlias("good")
    @XStreamAsAttribute
    private boolean good;

    public Test(String name, boolean good){
        this.name = name;
        this.good = good;
    }

    public static void main(String[] args) {
        XStream stream = new XStream();
        stream.processAnnotations(new Class[] {Test.class});

        Test test1 = new Test("Test", true);
        System.out.println(stream.toXML(test1));
        Test test2 = new Test("Test", false);   
        System.out.println(stream.toXML(test2));    
    }
}

这打印:

<Test name="Test" good="true"/>
<Test name="Test" good="false"/>

我希望它是:

<Test name="Test" good="true"/>
<Test name="Test"/>

编辑:
我注意到 BooleanConverter 有一个名为的方法shouldConvert,所以我尝试通过扩展类来覆盖它。哪个不起作用,它永远不会被调用。方法:

@Override
public boolean shouldConvert(Class type, Object value) {
  System.out.println("Class: "+type+" Value: "+value);
  return (Boolean)value;
}

我的变量注释来设置转换器good

@XStreamConverter(MyBooleanConverter.class)
@XStreamAlias("good")
@XStreamAsAttribute
private boolean good;
4

2 回答 2

1

我最近遇到了同样的问题,发现避免 XStream 为布尔值实例化默认值的最简单方法是让你的布尔值 java.lang.Booleans 而不是原始布尔值。

所以像这样简单地定义你的属性就可以了:

@XStreamAlias("good")
@XStreamAsAttribute
private Boolean good;
于 2017-11-22T10:54:40.357 回答
0

您必须编写自己的BooleanConverter重写toString(Objec obj)方法。

public class MyBooleanConverter extends BooleanConverter{

    @Override
    public String toString(Object obj) {
        if(((Boolean)obj).equals(false)){
            return null;
        }
        return super.toString(obj);
    }   

}

然后设置注释以在您想要的变量上使用转换器:

@XStreamConverter(MyBooleanConverter.class)
@XStreamAlias("good")
@XStreamAsAttribute
private boolean good;

这可行,但需要您每次都在 XStreamConverter 中设置添加注释。我宁愿不必这样做,因为我希望我的转换器比默认的更频繁地使用。你可以用它registerConverter来实现。这是完整的示例:

public class Test {

    @XStreamAlias("name")
    @XStreamAsAttribute
    private String name;

    @XStreamAlias("good")
    @XStreamAsAttribute
    private boolean good;

    public Test(String name, boolean good){
        this.name = name;
        this.good = good;
    }

    public static void main(String[] args) {
        XStream stream = new XStream();
        stream.processAnnotations(new Class[] {Test.class});
        stream.registerConverter(new MyBooleanConverter());

        Test test1 = new Test("Test", true);
        System.out.println(stream.toXML(test1));
        Test test2 = new Test("Test", false);   
        System.out.println(stream.toXML(test2));    
    }
}
于 2012-11-08T18:37:20.483 回答