Простой XML и HashSet
Я открываю Simple XML и пытаюсь сериализовать этот простой класс:
public class Div
{
private Set< String > _classes = new HashSet< String >() {{
add( "a" );
add( "b" );
add( "c" );
}};
// some methods and attributes...
}
Кому:
<div class="a b c">
</div>
Существует аннотация @Attribute, но она не может преобразовать набор в строку. Простой XML предоставляет некоторые "трансформеры" для выполнения этой работы, но я не могу найти никакого примера.
Спасибо
1 ответ
Вместо трансформаторов лучше использовать Converter
, Вы можете использовать их как в классе, так и в отдельных полях. По сути, конвертер - это реализация "как перевести аннотированный объект в узлы xml".
Вот пример, используя Converter
для класса Div
:
@Root(name = "div")
@Convert(value = Div.DivConverter.class) // Set the Converter for this class
public class Div
{
private Set< String> _classes = new HashSet< String>()
{
{
add("a");
add("b");
add("c");
}
};
// some methods and attributes...
public Set<String> getClasses()
{
return _classes;
}
// ...
/*
* Converter implementation.
*/
static class DivConverter implements Converter<Div>
{
@Override
public Div read(InputNode node) throws Exception
{
/*
* Not required for writing, therefore not implemented int this
* example.
*/
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void write(OutputNode node, Div value) throws Exception
{
StringBuilder sb = new StringBuilder(); // Used to store the set's values in string-form
Set<String> cl = value.getClasses();
if( cl.isEmpty() == false ) // Check if classes is empty - nothing to do if so
{
int pos = 0; // Keep trac of current position (not to add an blank char for last entry)
final int size = cl.size();
for( String s : cl ) // Iterate over all entries of classes
{
sb.append(s); // Append the entry to buffer
if( (pos++) < size - 1 )
{
sb.append(' '); // If not last entry, add a blank
}
}
}
// Finally add the attribute 'class' with the content, to the 'div'-node
node.setAttribute("class", sb.toString());
}
}
}
Примечание: Конвертеры могут быть реализованы как обычные классы, я использовал внутренний для этого примера, чтобы все было вместе.
Как пользоваться:
Div d = new Div();
File f = new File("test.xml");
Serializer ser = new Persister(new AnnotationStrategy()); /* Don't miss AnnotationStrategy!! */
ser.write(d, f);
Для десериализации просто реализуйте конвертер read()
метод. Чтобы вернуть значение атрибутов обратно в набор, используйте StringTokenizer
,