Как маршалировать/демаршалировать связанные объекты Java с помощью JAXB

Совсем недавно я уже задавал вопрос о JAXB, который можно найти по адресу: Как маршалировать/демаршалировать объекты Java с закрытыми полями с помощью JAXB.

Моя текущая проблема заключается в том, что я пытаюсь маршалировать структуру графа, реализованную с использованием структуры списка смежности.

Класс вершин:

@XmlElement
private int index;
@XmlElementWrapper(name="adj_list")
@XmlElement(name="vertex")
private ArrayList<Vertex> adjList;

Класс края:

@XmlElement(name="vertex")
private Vertex v1;
@XmlElement(name="vertex")
private Vertex v2;
@XmlElement
private String label;

Класс графика:

@XmlElementWrapper(name="vertices")
@XmlElement(name="vertex")
private ArrayList<Vertex> vertices;
@XmlElementWrapper(name="edges")
@XmlElement(name="edge")
private ArrayList<Edge> edges;

Когда я заполняю экземпляр графа и пытаюсь его маршалировать, я получаю исключение, в частности javax.xml.bind.MarshalException.

Насколько я понимаю, эта проблема связана с тем, что класс Vertex хранит Vertex ArrayList, который является потенциальным циклом, поэтому JAXB жалуется на это. Я немного погуглил, но не могу найти решение для этого.


person temelm    schedule 28.04.2013    source источник


Ответы (1)


Если на каждый узел в вашем XML ссылаются через отношение сдерживания (например, @XmlElement), то вы можете использовать @XmlID/@XmlIDREF для использования отношений на основе ключей, чтобы превратить дерево в граф.

person bdoughan    schedule 29.04.2013