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

Wil*_*ing 11 java collections xstream xml-serialization

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

List<String> tags = new List<String>();
Run Code Online (Sandbox Code Playgroud)

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

<tags>
  <string>tagOne</string>
  <string>tagTwo</string>
  <string>tagThree</string>
  <string>tagFour</string>
</tags>
Run Code Online (Sandbox Code Playgroud)

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

jit*_*ter 12

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

相关片段:

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

成熟的例子:

import com.thoughtworks.xstream.*;
import com.thoughtworks.xstream.converters.collections.*;
import com.thoughtworks.xstream.mapper.*;
import java.util.*;

public class Test {
    public List<String> tags = new ArrayList<String>();
    public List<String> notags = new ArrayList<String>();
    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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

xstream.alias("tag", java.lang.String.class);
Run Code Online (Sandbox Code Playgroud)


Jim*_*ans 5

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

xstream.alias("tag", org.goring.Tag.class);
Run Code Online (Sandbox Code Playgroud)

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

  • 你能详细说明Tag类是怎样的吗?如果我在其中保留一个字符串变量(比如tagValue),我会得到类似<tags> <tag> <tagValue> tagOne </ tagValue> </ tag> <tag> <tagValue> tagTwo </ tagValue> </ tag> </标签>.提前致谢. (2认同)