Из интереса я попробовал сделать это, не написав свой собственный конвертер. В основном я просто зарегистрирую специальную заданную версию 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<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));
}
}
Не тестировался, но это должно работать. Нет?
xstream.alias("tag", java.lang.String.class);
Это именно то, что я закончил делать примерно полчаса назад. Работал. :) –
Не могли бы вы рассказать о том, как может быть класс Tag? Если я держу строку переменной (скажем tagValue) в нем, я получаю что-то вроде tagOne tagTwo . Заранее спасибо. –
Jonna
Как говорит Йонна выше, я не думаю, что это даст вам результат, который вы хотите, если я не упустил что-то. Я только что попробовал и нашел то же самое, что и Джонна. Решение ниже с использованием CollectionConverter и ClassAliasingMapper делало то, что мне нужно только в 3 строках кода. – DaveyDaveDave