Простой 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,

Другие вопросы по тегам