XStream, Aliasing и "DuplicateFieldException"

Я пытаюсь написать приложение, чтобы оно могло читать этот вид XML и создавать на его основе целый объект;

<actor id="id273211" PGFVersion="0.19" GSCVersion="0.10.4">
  <attributes>
    <text id="name">Actor 1b</text>
    <point id="position">
      <real id="x">0</real>
      <real id="y">0</real>
    </point>
  </attributes>
</actor>

Моя проблема в том, что я называю членов класса Point "реальными", и это дает исключение.

Что у меня сейчас есть;

@XStreamAlias("actor")
public class Actor {

    @XStreamAsAttribute
    String id = "",PGFVersion = "", GSCVersion = "";
    Attributes attributes = new Attributes();
}


public class Attributes {

    public Text text = new Text("name", "Actor 1");
    public Point point = new Point();

}


@XStreamConverter(value=ToAttributedValueConverter.class, strings={"value"})
@XStreamAlias("text")
public class Text {

    @XStreamAsAttribute
    String id;

    String value;

    public Text(String text, String value) {
        this.id = text;
        this.value = value;
    }


public class Point {
     @XStreamAlias("real")
     public Real x = new Real("x", "11");
     @XStreamAlias("real") 
     public Real y = new Real("y", "21");
     @XStreamAsAttribute
     public String id = "position";

}

И мой Test.java:

public static void main(String[] args) throws Exception {

    XStream xstream = new XStream();

    Actor actor2 = new Actor();

    xstream.processAnnotations(Text.class);
    xstream.processAnnotations(Real.class);
    xstream.processAnnotations(Point.class);
    xstream.processAnnotations(Actor.class);

    String xml = xstream.toXML(actor2);

    System.out.println(xml);

}

Это выводит XML отлично, следующим образом:

<actor id="" PGFVersion="" GSCVersion="">
  <attributes>
    <text id="name">Actor 1</text>
    <point id="position">
      <real id="x">11</real>
      <real id="y">21</real>
    </point>
  </attributes>
</actor>

Но когда я пытаюсь импортировать его, используя:

String xml = xstream.toXML(actor2);

Actor actorNew = (Actor)xstream.fromXML(xml);
System.out.println(xml);

Это дает исключение:

Исключение в потоке "main" com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: дублирующее поле y ---- Отладочная информация ---- поле: y класс: projectmerger1.Point Обязательный тип: projectmerger1.Point converter- тип: com.thoughtworks.xstream.converters.reflection.ReflectionConverter путь: /projectmerger1.Actor/attributes/point/real[2] номер строки: 6 class[1]: projectmerger1.Attributes class[2]: projectmerger1.Actor

версия: 1.4.6

Это неправильная настройка в целом или я могу продолжать использовать ее с некоторыми изменениями?

1 ответ

Решение

Я решил это, изменив класс Point;

public class Point {
    /*
     @XStreamAlias("real")
     @XStreamAlias("real2") 
     public Real y = new Real("y", "21");
     @XStreamAsAttribute
     public String id = "position";
     */

    @XStreamImplicit
     public List xy = new ArrayList();


     public void add(Real entry) {
                xy.add(entry);
        }

}

и добавив это в мой Test.java:

    actor2.attributes.point.add(new Real("x","0"));
    actor2.attributes.point.add(new Real("y","0"));

Я буду продолжать экспериментировать с этим. Спасибо за поддержку.

Другие вопросы по тегам