2016-09-18 100 views
0

XML:西河返回一個字符串,而不是對象(解組)

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

的Java:

class FooBar { 
    private Foo foo; 
} 

我尋找的是不要保存Foo對象FooBar而是添加Foo方式對象存儲在靜態映射中,並只存儲類FooBar中的屬性名稱(FooName)。

換句話說,我想僅在需要時解析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」已經是已知的。

回答

0

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); 
} 

這不是很好,但它的工作原理。

相關問題