0

XStream注釈を使用して、Java オブジェクトと XML の間を行き来しています。私は本質的に XML を可能な限り最小限にしようとしていますが、削減したい項目の 1 つは、boolean必要のないときに値を含めることです。boolean値がの場合、falseデフォルト値も false であるため、xml に含めたくありません。

デフォルト値と等しい場合に値を含めないように 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

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 に答える