SimpleXML框架:如何转换非标准的基本类型表示?

时间:2013-09-01 20:37:58

标签: java xml simple-framework

我试图说服SimpleXML将我的Java对象转换为XML和从XML转换。我有一个(看似)简单的问题,但我现在已经浪费了大量时间来搜索描述或执行以下操作的示例:

我需要读取或生成的XML格式包含定义颜色的整数值,它们表示为十六进制整数(但没有前导" 0x",与HTML或misc中相同.Android。 xml文件),即红色=" ff0000",蓝色=" 00ff00",绿色=" 0000ff"等

我的XML包含以下元素:

<SomeObject name="foobar" checkedColor="123456" flaggedColor="FEDCBA" ... />

相应的Java类读取:

public class SomeObject 
{
    @Attribute
    String name;
    @Attribute #######
    int checkedColor;
    @Attribute #######
    int flaggedColor;
    // ...
}

我在上面用#######标记了我正在谈论的两个属性。颜色值应为&#34; int&#34;。

如何教SimpleXML这些值表示为十六进制字符串以及如何转换它们? 我需要编写什么变换器或转换器或者其他什么来使这些int值转换为/如同所示的十六进制字符串,以及在上面的代码中我需要注释以实现它?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我终于能够通过定义类型“HexInt”来实现我想要的内容,如下所示

public class HexInt
{
    private int value;

    public HexInt(int value) {
        setValue(value);
    }
    public HexInt(String value) {
        setValue(value);
    }

    protected int getValue() {
        return this.value;
    }

    protected void setValue(int value) {
        this.value = value;
    }
    protected void setValue(String value) {
        setValue(Integer.parseInt(value, 16));
    }

    @Override
    public String toString() {
        return Integer.toHexString(getValue());     
    }
}

并将相应的属性定义为

...
@Attribute(required=false)
protected HexInt checkedcolor;
@Attribute(required=false)
protected HexInt flaggedcolor;
...

加上定义匹配器,对于HexInt-s,它提供了一个相应的Transformer,可以正确地将这些值转换为字符串。

但我讨厌这个解决方案的是,我不仅需要注释我的java代码来实现该结果,而且实际上必须使用特殊的,特定于表示的类,即使从程序逻辑中也绝对没有必要定义一个只包含int的特殊类,只是因为我想以特殊的方式序列化这两个字段。 IMHO遵循面向方面的精神,内部表示(“int”)应该在基本的Java代码中定义,并且该代码应该与外部化时数据的表示方式无关。 另一方面,外部表示(即我是否要将int值表示为十进制或十六进制字符串)应仅在注释中定义(加上支持类,如Matcher和Transformer),但不是 in基本的Java代码。

SimpleXML框架中是否真的没有办法让这些不同方面更清晰地分开?