使用xstream自定义java集合的序列化

我有一个需要序列化为XML的对象,其中包含以下字段:

List tags = new List(); 

XStream将它串行化(在一些别名之后),如下所示:

  tagOne tagTwo tagThree tagFour  

这是可以的,但我希望能够将元素重命名为,例如 。 我无法从XStream网站上的别名文档中看到一种明显的方法。 我错过了一些明显的东西吗

我建议将List更改为List ,其中Tag是一个基本上只包含String的域对象。 然后你说:

 xstream.alias("tag", org.goring.Tag.class); 

而且你得到了你想要的。 这可以避免必须滚动自己的转换器。

出于兴趣,我尝试了这样做,而没有编写我自己的转换器。 基本上我只是为某个类中的某个字段注册了一个特殊的CollectionConverter指令版本。

相关片段:

 ClassAliasingMapper mapper = new ClassAliasingMapper(xstream.getMapper()); mapper.addClassAlias("tag", String.class); xstream.registerLocalConverter( Test.class, "tags", new CollectionConverter(mapper) ); 

成熟的例子:

 import com.thoughtworks.xstream.*; import com.thoughtworks.xstream.converters.collections.*; import com.thoughtworks.xstream.mapper.*; import java.util.*; public class Test { public List tags = new ArrayList(); public List notags = new ArrayList(); public Test(String tag, String tag2) { tags.add(tag); tags.add(tag2); notags.add(tag); notags.add(tag2); } public static void main(String[] args) { Test test = new Test("foo", "bar"); XStream xstream = new XStream(); ClassAliasingMapper mapper = new ClassAliasingMapper(xstream.getMapper()); mapper.addClassAlias("tag", String.class); xstream.registerLocalConverter( Test.class, "tags", new CollectionConverter(mapper) ); System.out.println(xstream.toXML(test)); } } 

没有测试,但这应该工作。 没有?

 xstream.alias("tag", java.lang.String.class); 
 @XStreamAlias("example") public class A { private B myList; public A(){ this.myList = new B(); } public A clone(){ A a = new A(); a.myList = this.myList; return a; } public B getMyList() { return myList; } public void setMyList(B myList) { this.myList = myList; } } public class B { @XStreamImplicit(itemFieldName = "myField") ArrayList myFieldlist; public B(){ this.myFieldlist = new ArrayList(); } public B clone(){ B b = new B(); b.myFieldlist = this.myFieldlist; return b; } public ArrayList getMyFieldlist() { return myFieldlist; } public void setMyFieldlist(ArrayList myFieldlist) { this.myFieldlist = myFieldlist; } } public class Test { public static void main(String[] args) { A a = new A(); a.getMyList().getMyFieldlist().add("aa"); a.getMyList().getMyFieldlist().add("bb"); XStream xs = new XStream(new DomDriver()); xs.processAnnotations(A.class); xs.processAnnotations(B.class); System.out.println(xs.toXML(a)); } } 

xml结果:

   aa bb   

java.util.String类添加别名。 好吧,这可能会破坏其他地方的其他东西,但在这个确切的情况下应该足够了。

如果你不想做上面的事情,你可以制作自己的转换器( 参见这个方便的教程 ),它将帮助你实现目标。 并且不要害怕制作自己的转换器,它们真的很容易实现。

 @XStreamConverter(value=ListToStringXStreamConverter.class, strings={"tag"}) List tags = new List(); 

在ListToStringXStreamConverter.java中

 public class ListToStringXStreamConverter implements Converter { private String alias; public ListToStringXStreamConverter(String alias) { super(); this.alias = alias; } @SuppressWarnings("rawtypes") @Override public boolean canConvert(Class type) { return true; } @Override public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { @SuppressWarnings("unchecked") List list = (List)source; for (String string : list) { writer.startNode(alias); writer.setValue(string); writer.endNode(); } } @Override public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { throw new UnsupportedOperationException("ListToStringXStreamConverter does not offer suport for unmarshal operation"); } } 

对我来说,使用下面的代码,使用字符串:

 xStream.alias("myTag", Person.class); xStream.addImplicitCollection(Person.class, "myTag", "myTag", String.class); 
 public class Person{ private ArrayList myTag; // ... } 
  atrcxb2102 sub3