Платформа SimpleXML: как преобразовать нестандартное представление базового типа?

Я пытаюсь убедить SimpleXML преобразовать мои объекты Java в XML и обратно. У меня (казалось бы) простая проблема, но я уже потратил много времени на поиск описания или примера для выполнения следующего:

Формат XML, который мне нужно прочитать или сгенерировать, содержит целочисленные значения, определяющие цвета и представленные как шестнадцатеричные целые числа (но без ведущего «0x», как в HTML или в других файлах Android .xml), т. е. red=" ff0000", синий="00ff00", зеленый="0000ff" и т. д.

Мой XML содержит такие элементы, как:

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

Соответствующий класс Java гласит:

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

Я пометил два атрибута, о которых я здесь говорю, ####### выше. Значения цвета должны быть типа "int".

Как мне научить SimpleXML, что эти значения представлены в виде шестнадцатеричной строки и как их преобразовать? Какой преобразователь или преобразователь или что-то еще мне нужно написать, чтобы эти значения int были преобразованы в/из шестнадцатеричных строк, как показано, и что мне нужно аннотировать в приведенном выше коде для достижения этого?


person mmo    schedule 01.09.2013    source источник


Ответы (2)


Используйте преобразование, см. документацию ниже.

http://simple.sourceforge.net/download/stream/doc/javadoc/org/simpleframework/xml/transform/Transform.html

person ng.    schedule 02.09.2013
comment
Я видел эту часть учебника, но, увы, она не работает, потому что нельзя определить реализацию Transform‹int› (поскольку int является базовым типом). - person mmo; 03.09.2013
comment
Я также пытался определить класс HexInt extends Integer , но это не сработало, поскольку Integer является окончательным классом. :-( Любые предложения, как обойти такие ограничения? Кроме того: не будет ли такой преобразователь использоваться для ВСЕХ атрибутов, которые являются int? Как можно ограничить его использованием только для этих двух конкретных атрибутов int, но не для другие, например, если бы у меня был атрибут ширины или высоты, где я хотел бы использовать обычные (т.е. десятичные) целые числа, а не шестнадцатеричные числа? - person mmo; 03.09.2013

Наконец-то я смог реализовать то, что хочу, определив тип «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;
...

плюс определение Matcher, который для HexInt-s предоставляет соответствующий Transformer, который правильно преобразует эти значения в строки и из строк.

Но что мне не нравится в этом решении, так это то, что мне пришлось не только аннотировать свой java-код для достижения этого результата, но и фактически пришлось использовать специальные, специфичные для представления классы, хотя из логики программы не было бы абсолютно никакой необходимости определять специальный класс, содержащий только int, просто потому, что я хочу особым образом сериализовать эти два поля. ИМХО, следуя аспектно-ориентированному духу, внутреннее представление ("int") должно быть определено в базовом Java-коде, и этот код не должен зависеть от того, как данные представляются при внешнем отображении. С другой стороны, внешнее представление (т.е. хочу ли я представлять int-value как десятичную или шестнадцатеричную строку) должно быть определено ТОЛЬКО в аннотациях (плюс вспомогательные классы, такие как Matcher и Transformer), но не в основной код Java.

Неужели в фреймворке SimpleXML нет способа более четко разделить эти разные аспекты?

person mmo    schedule 04.09.2013