2

simple-xml アノテーションが付けられた次の列挙型を考えてみましょう。

@Root(name="days")
public enum DaysOfWeek {

    SUNDAY("blue", 30),
    MONDAY("green", 60),
    TUESDAY("yellow", 50),
    WEDNESDAY("red", 45),
    THURSDAY("black", 45),
    FRIDAY("white", 65),
    SATURDAY("brown", 40);

    @Attribute(name="color")
    private String color;

    @Element(name="mins")
    private int minutes;


    DaysOfWeek(String color, int minutes){
        this.color = color;
        this.minutes = minutes;
    }

    DaysOfWeek(){
        /*
         * Default constructor
         */
    }

    public void setColor(String color){
        this.color = color;
    }

    public void setMinutes(int minutes){
        this.minutes = minutes;
    }

    public String getColor(){
        return this.color;

    }

    public int getMinutes(){
        return this.minutes;
    }
}

そして、単純なフレームワークを使用して XML にシリアル化するコード:

    StringWriter writer = new StringWriter();
    try {
        serializer.write(DaysOfWeek.TUESDAY, writer);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println(writer.toString());

simple-2.6 では、次の出力が表示されます。これは私が期待するものです。

<days color="yellow">
   <mins>50</mins>
</days>

ただし、同じコードを simple-2.6.7 でシリアル化すると、次のようになります。

<daysOfWeek>TUESDAY</daysOfWeek>

基本的に、simple-2.6.7 では、enum の個々のメンバー (およびそれらの simple-xml 注釈) は無視され、常に enum 定数の名前がシリアル化に使用されます。

これは意図したものですか?列挙型の個々のメンバーを考慮しながら列挙型をシリアル化するための simple-xml の最新バージョンを取得するにはどうすればよいですか?

4

1 に答える 1

2

(2.6.x) リリースの変更ログには、enumを含むエントリが 1 つだけあります。

Simple 2.6.3:
- 抽象列挙型を正しくシリアライズできるようにするためのバグ修正

しかし、なぜ連載を希望colorし、取得したいのですか?minutesserialize と deserializeDaysOfWeekの場合、列挙型は定義 (コンストラクター) に従って値を取得します。


とにかくConverter、XML をカスタマイズするためにを使用できます。

の注釈DaysOfWeek:

@Root(name = "days")
@Convert(DaysOfWeekConverter.class)
public enum DaysOfWeek
{
    // ...
}

注:アノテーションはもう必要ありません@Element@Attributeこのクラスの xml の「コンテンツ」は、Converter今では指定されています。

(可能性あり)Converter -Interfaceの実装:

public class DaysOfWeekConverter implements Converter<DaysOfWeek>
{
    @Override
    public DaysOfWeek read(InputNode node) throws Exception
    {
        DaysOfWeek rtn = getDayByColor(node.getAttribute("color").getValue());
        rtn.setMinutes(Integer.valueOf(node.getNext("mins").getValue()));

        return rtn;
    }


    @Override
    public void write(OutputNode node, DaysOfWeek value) throws Exception
    {
        node.setName("days");
        node.setAttribute("color", value.getColor());
        node.getChild("mins").setValue("" + value.getMinutes());
    }


    private DaysOfWeek getDayByColor(String color)
    {
        for( DaysOfWeek value : DaysOfWeek.values() )
        {
            if( value.getColor().equals(color) )
                return value;
        }

        throw new IllegalArgumentException("No Day available for color \'" + color + "\'");
    }
}

(例)コンバーターの使用:

/*
 * Setting 'AnnotationStrategy' is requried here - else the Converter will get ignored.
 */
Serializer ser = new Persister(new AnnotationStrategy());

StringWriter sw = new StringWriter();
ser.write(DaysOfWeek.TUESDAY, sw);

// ...

StringReader sr = new StringReader(sw.toString());
DaysOfWeek day = ser.read(DaysOfWeek.class, sr);

// ...

シリアル化された XML (例から) :

<days color="yellow">
   <mins>50</mins>
</days>

ドキュメンテーション:

于 2012-11-26T22:03:48.607 に答える