1

xStream を使用して非常に単純なグラフを XML にシリアル化しています。この出力は、必要なものにかなり近いものです。

<grafo>
  <nodo id="1">
   <nodo id="2"/>
  </nodo>
  <nodo id="2">
    <nodo id="3"/>
    <nodo id="4"/>
  </nodo>
  <nodo id="3">
    <nodo id="5"/>
  </nodo>
  <nodo id="4">
    <nodo id="6"/>
  </nodo>
 </grafo>

しかし、別のノード (エッジ) 内のすべてのノードが "nodo" ではなくエイリアス "child" で表示されるように出力する必要があります。

4

1 に答える 1

0

単純なエイリアスでこれを行うことができるとは思いません。ただし、以下のようなカスタムシリアライザーを使用して実行できます。xstream doc には、カスタム コンバーターの登録方法の詳細を含む優れたコンバーター チュートリアルがあります。

public class Nodo {
  String id;
  ArrayList<Nodo> children = new ArrayList<>();
}

public class NodoConverter implements Converter {


  /** {@inheritDoc} */
  @Override
  public boolean canConvert(Class arg0) {
    return arg0.equals(Nodo.class);
  }

  /** {@inheritDoc} */
  @Override
  public void marshal(Object arg0, HierarchicalStreamWriter writer, MarshallingContext arg2) {
    marshal((Nodo) arg0, writer, arg2, "nodo");
  }

  private void marshal(Nodo nodo, HierarchicalStreamWriter writer, MarshallingContext ctx, String elname) {
    writer.addAttribute("id", nodo.getId());
    for (Nodo child : nodo.children) {
      writer.startNode("child");
      ctx.convertAnother(child);
      writer.endNode();
    }
  }

  /** {@inheritDoc} */
  @Override
  public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext ctx) {
    Nodo nodo = new Nodo();
    nodo.setId(reader.getAttribute("id"));
    while (reader.hasMoreChildren()) {
      reader.moveDown();
      Nodo child = (Nodo) ctx.convertAnother(nodo, Nodo.class);
      nodo.children.add(child);
      reader.moveUp();
    }
  }

}
于 2012-10-26T00:56:17.820 に答える