【问题标题】:Xstream return a string instead of the object (unmarshal)Xstream 返回一个字符串而不是对象(解组)
【发布时间】:2016-09-18 14:54:48
【问题描述】:

XML:

<FooBar>
    <foo name="FooName">
        <bar .../>
        <bar .../>
    </foo>
</FooBar>

Java:

class FooBar {
    private Foo foo;
}

我正在寻找一种不将Foo 对象存储在FooBar 中的方法,而是将Foo 对象添加到静态映射中并仅将属性名称(FooName)存储在类FooBar 中。

换句话说,我只想在需要时解析foo(未知名称)并将名称存储在FooBar中。

类似这样的:

FooBar.java

class FooBar {
    @XStreamConverter(FooConverter.class)
    private String foo;
}

FooConverter.java

public class FooConverter extends ReflectionConverter {

    public FooConverter(Mapper mapper, ReflectionProvider reflectionProvider) {
        super(mapper, reflectionProvider);
    }

    @Override
    public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext mc) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext uc) {
        String name = reader.getAttribute("name");
        Foo foo = FOOMAP.get(name);

        if (foo != null) {
            return name;
        }
        foo = (Foo) super.unmarshal(reader, uc);
        FOOMAP.put(name, foo);

        return name;
    }

    @Override
    public boolean canConvert(Class type) {
        return type == Foo.class || type == String.class;
    }

}

目的是只解析一次foo标签,如果我们已经知道它(同名属性),并且能够使用&lt;foo name="FooName" /&gt;做一种包含,因为“FooName”是已知的。

【问题讨论】:

    标签: java unmarshalling xstream


    【解决方案1】:

    ReflectionConverter 有一个函数doUnmarshal,第一个参数是一个对象。

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext uc) {
        String name = reader.getAttribute("name");
        Foo foo = FOOMAP.get(name);
    
        if (foo != null) {
            return name;
        }
    
        foo = (Foo) super.doUnmarshal(new Foo(), reader, uc);
        if(foo.getSomething() != null) // check if foo is not empty
            FOOMAP.put(name, foo);
    
        return name;
    }
    
    @Override
    public boolean canConvert(Class type) {
        return type.equals(String.class);
    }
    

    这不是很好,但它有效。

    【讨论】:

      猜你喜欢
      • 2017-09-22
      • 2017-07-18
      • 2011-07-29
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多