2015-11-22 8 views
1

У меня есть следующая проблема, и я понятия не имею, как это решить.как игнорировать имя поля в то время как маршаллинг/unmarshalling объект java

У меня есть список различных типов точек, основанных на общем интерфейсе. Я использую Java XStream для сортировки и развязывания этих классов.

public static void main(String[] args) { 

    List<IPoint> listOfPoint = new ArrayList<IPoint>(); 
    listOfPoint.add(new PointTypeA(0.1)); 
    listOfPoint.add(new PointTypeB(0.2)); 
    listOfPoint.add(new PointTypeA(0.3)); 
    PointSet ps = new PointSet(1, listOfPoint); 

    XStream xstream = new XStream(new StaxDriver()); 
    xstream.processAnnotations(PointTypeA.class); 
    xstream.processAnnotations(PointTypeB.class); 
    xstream.processAnnotations(PointSet.class); 

    String xml = xstream.toXML(ps); 
    System.out.println(xml); 
} 

Когда я печатаю свои объекты в формате XML, я получаю следующий результат:

<set id="1"> 
    <typeA> 
    <xCoordinate>0.1</xCoordinate> 
    </typeA> 
    <typeB> 
    <xCoordinate>0.2</xCoordinate> 
    </typeB> 
    <typeA> 
    <xCoordinate>0.3</xCoordinate> 
    </typeA> 
</set> 

Но вместо результата выше, я хочу иметь следующий вывод:

<set id="1"> 
    <typeA>0.1</typeA> 
    <typeB>0.2</typeB> 
    <typeA>0.3</typeA> 
</set> 

Я хочу не иметь тегов, как <xCoordinate>, но я хочу, чтобы их значение хранилось в теге classname. Я не хочу игнорировать значение поля xCoordinate, но я хочу иметь «встроенное значение». Можно ли это сделать? Я пробовал конвертеры без успеха, и я понятия не имею, как это решить.

Мои классы:

public interface IPoint { 

    int getSomeInformation(); 
} 

@XStreamAlias("set") 
public class PointSet { 

    @XStreamAsAttribute 
    private int id; 

    @XStreamImplicit 
    private List<IPoint> points; 

    public PointSet(int id, List<IPoint> points) { 
     super(); 
     this.id = id; 
     this.points = points; 
    } 
} 

@XStreamAlias("typeA") 
public class PointTypeA implements IPoint { 

    private double xCoordinate; 

    public PointTypeA(double d) { 
     super(); 
     this.xCoordinate = d; 
    } 
} 

@XStreamAlias("typeB") 
public class PointTypeB implements IPoint { 

    private double xCoordinate; 

    public PointTypeB(double d) { 
     super(); 
     this.xCoordinate = d; 
    } 
} 

Пожалуйста, помогите мне, если вы можете. Спасибо.

+0

Я не знаю, как работает XStream, но обычно на Java вы используете ключевое слово «переходный», чтобы указать, что переменная не должна автоматически сохраняться/извлекаться. Не смешивайте его с «изменчивым» btw, который указывает, что переменная должна быть прочитана и записана в терминах кеширования. – JayC667

ответ

0

Конвертер для вашего класса точек довольно прост.

public static class CoordConverter implements Converter 
{ 
    public boolean canConvert(Class clazz) 
    { 
     return PointTypeA.class == clazz; 
    } 

    public void marshal(Object object, HierarchicalStreamWriter hsw, MarshallingContext mc) 
    { 
     PointTypeA obj = (PointTypeA) object; 
     hsw.setValue(String.valueOf(obj.xCoordinate)); 
    } 

    public Object unmarshal(HierarchicalStreamReader hsr, UnmarshallingContext uc) 
    { 
     double val = Double.parseDouble(hsr.getValue()); 
     PointTypeA obj = new PointTypeA(val); 
     return obj; 
    } 
} 

Вы можете зарегистрировать его с

xstream.registerConverter(new CoordConverter()); 

Конечно, этот конвертер действителен для PointTypeA класса, но вы можете легко расширить выше кода для других классов вам нужно, и/или написать более обобщенную версию.

 Смежные вопросы

  • Нет связанных вопросов^_^