【问题标题】:How to conditionally serialize a field (attribute) using XStream如何使用 XStream 有条件地序列化字段(属性)
【发布时间】:2011-06-29 09:42:57
【问题描述】:

我正在使用 XStream 对对象进行序列化和反序列化。例如,一个名为Rating的类定义如下:

Public Class Rating {

  String id;
  int score;
  int confidence;

  // constructors here...
}

但是,在这个类中,变量confidence 是可选的。

因此,当置信度值已知(不是 0)时,Rating 对象的 XML 表示应如下所示:

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

但是,当置信度未知时(默认值为 0),置信度 应该从 XML 表示中省略属性:

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

谁能告诉我如何使用 XStream 有条件地序列化字段?

【问题讨论】:

    标签: xml-serialization xstream


    【解决方案1】:

    一种选择是写一个converter

    这是我快速为你写的一篇:

    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;
        }
    }
    

    您要做的就是注册转换器,并在您的 Rating 类中提供访问器方法(即 getId、getScore、getConfidence)。

    注意:您的另一个选择是适当地omit the field

    【讨论】:

      猜你喜欢
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2018-10-25
      • 2018-11-25
      • 2018-06-24
      相关资源
      最近更新 更多