[英]in Java Xstream how to change alias inside an object?
嗨,我正在使用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>
但是在輸出中,我需要另一個節點(邊緣)內的每個節點都以別名“ child”而不是“ nodo”出現,您的想法將非常准確。
我不相信您可以使用簡單的別名來做到這一點。 但是您可以使用下面的自定義序列化器來實現。 xstream文檔有一個很好的轉換器教程 ,其中包含有關如何注冊自定義轉換器的詳細信息。
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();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.