XStream:xstream 1.3.1中包含属性和文本节点的节点? [英] XStream : node with attributes and text node in xstream 1.3.1?
问题描述
我想使用XStream将对象序列化为此表单的XML。
I would like to serialize an object to an XML of this form with XStream.
<node att="value">text</node>
这里StackOverflow已经有了解决方案:
XStream:包含属性和文本节点的节点?
但它不适合我,因为我被限制在XStream 1.3.1。
There already is a solution for this in StackOverflow here: XStream : node with attributes and text node? but it won't work for me since I am restricted to XStream 1.3.1.
我找到了
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"content"})
以一种简单的方式完全按照我想要的方式完成,但它在XStream 1.3.1中不可用。
which does exactly what I want in a simple way but it is not available in XStream 1.3.1.
有没有更好的方法来解决这个问题使用1.3.1版本的XStream?
Is there a nicer way to solve this issue with 1.3.1 version of XStream?
推荐答案
这可能是一些黑客行为。主要的idia是从1.4.7使用修改后的 ToAttributedValueConverter
。
It's possible with some hacks. The main idia is to use a modified ToAttributedValueConverter
from 1.4.7.
- 复制
ToAttributedValueConverter
到您的包中 - 将
UseAttributeForEnumMapper
复制到您的包中 -
替换
ToAttributedValueConverter #fieldIsEqual
,如下所示:
- Copy
ToAttributedValueConverter
into your package - Copy
UseAttributeForEnumMapper
into your package Replace
ToAttributedValueConverter#fieldIsEqual
as follows:
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
有一个需要一些额外信息的constrcutor,比如value字段。但是你可以选择性地使用 XStream #registerConverter
。所以你的课必须看起来像:
It is not possible to use the @XStreamConverter
annotation, becouse the ToAttributedValueConverter
has a constrcutor that needs some extra information, like the value field. But you can use XStream#registerConverter
alternativly. So your class have to look like:
@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:
And a example that shows how to configure xstream for this converter:
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
这篇关于XStream:xstream 1.3.1中包含属性和文本节点的节点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!