通过一些技巧可以实现。主要的 idia 是使用从 1.4.7 修改的 ToAttributedValueConverter。
- 将
ToAttributedValueConverter复制到你的包中
- 将
UseAttributeForEnumMapper复制到你的包中
-
替换ToAttributedValueConverter#fieldIsEqual如下:
private boolean fieldIsEqual(FastField field) {
return valueField.getName().equals(field.getName())
&& valueField.getDeclaringClass().getName()
.equals(field.getDeclaringClass().getName());
}
-
替换UseAttributeForEnumMapper中的构造函数如下:
public UseAttributeForEnumMapper(Mapper wrapped) {
super(wrapped, null);
}
不能使用@XStreamConverter 注释,因为ToAttributedValueConverter 有一个需要一些额外信息的构造器,比如值字段。但是您可以交替使用XStream#registerConverter。所以你的班级必须看起来像:
@XStreamAlias("node")
public class Node {
private String attr;
private String content;
public void setAttr(String attr) { this.attr = attr; }
public String getAttr() { return attr; }
public void setContent(String content) { this.content = content; }
public String getContent() { return content; }
}
还有一个展示如何为此转换器配置 xstream 的示例:
public static void main(String[] args) {
final Node node = new Node();
node.setAttr("value");
node.setContent("text");
final XStream xstream = new XStream();
configureXStream(xstream);
final String xml = xstream.toXML(node);
System.out.println(xml);
final Node node2 = (Node) xstream.fromXML(xml);
System.out.println("attr: " + node2.getAttr());
System.out.println("content: " + node2.getContent());
}
private static void configureXStream(final XStream xstream) {
xstream.autodetectAnnotations(true);
final Mapper mapper = xstream.getMapper();
final ReflectionProvider reflectionProvider = xstream
.getReflectionProvider();
final ConverterLookup lookup = xstream.getConverterLookup();
final Converter converter = new ToAttributedValueConverter(Node.class,
mapper, reflectionProvider, lookup, "content");
xstream.registerConverter(converter);
}
这个程序打印出来:
<node attr="value">text</node>
attr: value
content: text