пользовательский конвертер в XStream - PullRequest
3 голосов
/ 16 марта 2010

Я использую XStream для сериализации моих объектов в формат XML. Форматированный xml, который я получаю, выглядит следующим образом: node1, node2, node 3 являются атрибутами pojo, DetailDollars

У меня есть требование, когда мне нужно рассчитать процент, например, 100/25 и добавить новый узел к существующим. Итак, окончательный результат должен быть:

<DetailDollars>
    <node1>100 </node1> 
    <node2>25</node2> 
    <node3>10</node3> 
</DetailDollars>

Я написал собственный конвертер и зарегистрировался в своем объекте xstream.

public void marshal(..){
         writer.startNode("node4");         
         writer.setValue(getNode1()/ getnode2() );
         writer.endNode();
}

Но поток xml, который я получаю, имеет только новый узел:

<DetailDollars> 
    <node4>4</node4>
</DetailDollars>

Я не уверен, какой xstream api даст мне желаемый формат. не могли бы вы помочь мне с этим.

1 Ответ

4 голосов
/ 28 сентября 2010

Вот конвертер, который вам нужен:

public class DetailDollarsConverter extends ReflectionConverter {

public DetailDollarsConverter(Mapper mapper,
        ReflectionProvider reflectionProvider) {
    super(mapper, reflectionProvider);
}

@Override
public void marshal(Object obj, HierarchicalStreamWriter writer,
        MarshallingContext context) {
    super.marshal(obj,writer,context);

    DetailDollars dl = (DetailDollars) obj;

    writer.startNode("node4");
    writer.setValue(Double.toString(dl.getNode1() / dl.getNode2()));
    writer.endNode();
}

@Override
public Object unmarshal(HierarchicalStreamReader reader,
        UnmarshallingContext context) {
    return super.unmarshal(reader,context);
}

@SuppressWarnings("unchecked")
@Override
public boolean canConvert(Class clazz) {
    return clazz.equals(DetailDollars.class);
}

}

...