2011-07-29 75 views
4

我有一个模型,看起来像:如何重命名XStream列表元素?

@XStreamAlias("article") 
class Article { 
    List<String> tags; 
    List<String> categories; 
} 

XStream的序列化为XML,看起来像:

<article> 
    <tags> 
    <string>foo</string> 
    </tags> 
    <categories> 
    <string>bar</string> 
    </categories> 
</article> 

我的问题是我怎样才能让这个<string>foo</string>成为<tag>foo<tag><string>bar</string>成为<category>bar</category>?我无法更改模型的结构,因为我正在使用Morphia ODM创建文章实例(文章必须包含List<String>)。

回答

5

This post可能对您有用。

果壳版本:

ClassAliasingMapper mapper = new ClassAliasingMapper(stream.getMapper()); 
mapper.addClassAlias("tag", String.class); 
mapper.addClassAlias("category", String.class); 
stream.registerLocalConverter(Article.class, "tags", new CollectionConverter(mapper)); 
stream.registerLocalConverter(Article.class, "categories", new CollectionConverter(mapper)); 
0

从我的脑海:

@XStreamImplicit(itemFieldName="tag") 
private List<String> categoryList; 

是否行得通?

+2

这是行不通的。这只是删除父''元素。 – Hokiedood

+0

@Hokiedood对不起,我不知道答案,可能是别人做的 – Omnaest

1

在XStream版本是1.4.5,你需要定义不同类的别名不同的映射对象。解决方案如下:

ClassAliasingMapper mapper = new ClassAliasingMapper(xstream.getMapper()); 

    //tag 
    mapper.addClassAlias("tag", String.class); 
    xstream.registerLocalConverter(
     Article.class, 
     "tags", 
     new CollectionConverter(mapper) 
    ); 


    mapper = new ClassAliasingMapper(xstream.getMapper()); 
      // this is required otherwise it will override the previos mapper 
    mapper.addClassAlias("category", String.class); 
    xstream.registerLocalConverter(
     Article.class, 
     "categories", 
     new CollectionConverter(mapper) 
    );