1

我有一个 XML 字符串,其属性包含整数值:

<item status="2" />

还有Simple Framework一个描述这个的类item

@Root
public static class Item {

    @Attribute(name="status")
    private int status;

    public int getStatus() {
        return status;
    }

}

反序列化效果很好,但是我希望能够将int类型更改为定义的enum类型。

public enum Status {
    OK(0), PENDING(1), ERROR(2);

    BetStatus(int status) {
        this.status = status;
    }

    public int getStatus() {
        return status;
    }
}

因此,快速修改:

@Root
public static class Item {

    @Attribute(name="status")
    private Status status;

    public Status getStatus() {
        return status;
    }

}

但是现在我收到一个错误:

java.lang.IllegalArgumentException: 2 is not a constant in com.my.package.Status

是否可以在反序列化期间以int这种方式进行转换?

我敢打赌我必须在我的Status课堂上添加一些神奇的方法。

解决方案:

根据Reimeus答案,我为属性留下int了类型,我只修改了类:statusItem

@Root
public static class Item {

    @Attribute(name="status")
    private int status;

    public Status getStatus() {
        return Status.getByOrdinal(status);
    }

}
4

2 回答 2

2

也许通过遍历类型:

public enum Status {
    OK(0), PENDING(1), ERROR(2);

    private int status;

    Status(int status) {
        this.status = status;
    }

    public static Status getByOrdinal(int ordinal) {
        for (final Status element : EnumSet.allOf(Status.class)) {
            if (element.ordinal() == ordinal) {
                return element;
            }
        }

        throw new IllegalArgumentException("Unknown status type: " + ordinal);
    }
}
于 2012-07-27T11:40:40.130 回答
1

getByOrdinal将Reimeus 提供的方法与一个额外的 setter 结合起来,该方法Item需要一个 int。

public void setStatus(int status)
{
    this.status = Status.getByOrdinal(status);
}
于 2012-07-27T11:54:01.343 回答