【发布时间】: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标签,如果我们已经知道它(同名属性),并且能够使用<foo name="FooName" />做一种包含,因为“FooName”是已知的。
【问题讨论】:
标签: java unmarshalling xstream