加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml-serialization – 如何使用XStream有条件地序列化字段(属性)

发布时间:2020-12-16 23:05:31 所属栏目:百科 来源:网络整理
导读:我正在使用XStream来序列化和反序列化对象.例如,名为Rating的类定义如下: Public Class Rating { String id; int score; int confidence; // constructors here...} 但是,在此类中,变量置信度是可选的. 因此,当置信度值已知(非0)时,Rating对象的XML表示应如
我正在使用XStream来序列化和反序列化对象.例如,名为Rating的类定义如下:

Public Class Rating {

  String id;
  int score;
  int confidence;

  // constructors here...
}

但是,在此类中,变量置信度是可选的.

因此,当置信度值已知(非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有条件地序列化字段?

解决方法

一种选择是写一个 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读