Как условно сериализовать поле (атрибут) с помощью XStream - PullRequest
4 голосов
/ 17 февраля 2011

Я использую XStream для сериализации и десериализации объекта.Например, класс с именем Rating определяется следующим образом:

Public Class Rating {

  String id;
  int score;
  int confidence;

  // constructors here...
}

Однако в этом классе переменная confidence является необязательной.

Итак, когда значение доверияизвестно (не 0), XML-представление объекта Rating должно выглядеть следующим образом:

<rating>
<id>0123</id>
<score>5</score>
<confidence>10</confidence>
</rating>

Однако, когда доверие неизвестно (значение по умолчанию будет 0), атрибут доверия должен быть опущениз XML-представления:

<rating>
<id>0123</id>
<score>5</score>
</rating>

Может кто-нибудь сказать мне, как условно сериализовать поле с использованием XStream?

1 Ответ

6 голосов
/ 22 февраля 2011

Один из вариантов - написать конвертер .

Вот один, который я быстро написал для вас:

import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class RatingConverter implements Converter
{

    @Override
    public boolean canConvert(Class clazz) {
        return clazz.equals(Rating.class);
    }

    @Override
    public void marshal(Object value, HierarchicalStreamWriter writer,
            MarshallingContext context) 
    {
        Rating rating = (Rating) value;

        // Write id
        writer.startNode("id");
        writer.setValue(rating.getId());
        writer.endNode();

        // Write score
        writer.startNode("score");
        writer.setValue(Integer.toString(rating.getScore()));
        writer.endNode();

        // Write confidence
        if(rating.getConfidence() != 0)
        {
            writer.startNode("confidence");
            writer.setValue(Integer.toString(rating.getConfidence()));
            writer.endNode();
        }
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader arg0,
            UnmarshallingContext arg1)
    {
        return null;
    }
}

Все, что вам остается сделать, этозарегистрируйте конвертер и предоставьте методы доступа (т. е. getId, getScore, getConfidence) в своем классе Rating.

Примечание. Другой вариант: пропустить поле соответственно.

...