XStream:xstream 1.3.1中包含属性和文本节点的节点? [英] XStream : node with attributes and text node in xstream 1.3.1?

查看:761
本文介绍了XStream: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.


  1. 复制 ToAttributedValueConverter 到您的包中

  2. UseAttributeForEnumMapper 复制到您的包中

  3. 替换 ToAttributedValueConverter #fieldIsEqual ,如下所示:

  1. Copy ToAttributedValueConverter into your package
  2. Copy UseAttributeForEnumMapper into your package
  3. 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屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆