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"));
Я буду продолжать экспериментировать с этим. Спасибо за поддержку.