XStream:xstream 1.3.1中包含属性和文本节点的节点?

时间:2014-05-09 17:36:25

标签: java xml xstream

我想使用XStream将对象序列化为此表单的XML。

<node att="value">text</node>

这里StackOverflow已经有了解决方案: XStream : node with attributes and text node? 它不适合我,因为我被限制在XStream 1.3.1。

我找到了

@XStreamConverter(value=ToAttributedValueConverter.class, strings={"content"}) 

它以一种简单的方式完全按照我想要的方式完成,但它在XStream 1.3.1中不可用。

使用1.3.1版本的XStream有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

一些黑客攻击可能。主要的idia是使用1.4.7中的修改后的ToAttributedValueConverter

  1. ToAttributedValueConverter复制到您的包中
  2. UseAttributeForEnumMapper复制到您的包中
  3. 如下所示替换ToAttributedValueConverter#fieldIsEqual

    private boolean fieldIsEqual(FastField field) {
        return valueField.getName().equals(field.getName())
                && valueField.getDeclaringClass().getName()
                        .equals(field.getDeclaringClass().getName());
    }
    
  4. 替换UseAttributeForEnumMapper中的构造函数,如下所示:

    public UseAttributeForEnumMapper(Mapper wrapped) {
        super(wrapped, null);
    }
    
  5. 不可能使用@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