Простая десериализация XML - PullRequest
5 голосов
/ 16 декабря 2009

Я пробую Простой XML-сериализатор . Меня больше интересует десериализация из XML-> Java. Вот мой код в качестве модульного теста:

import java.io.StringReader;
import java.io.StringWriter;

import junit.framework.TestCase;

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;

public class SimpleTest extends TestCase {
    public void testWriting() throws Exception {
        StringWriter writer = new StringWriter();
        Address address = new Address("1234 Main Street", "San Francisco", "CA");
        Serializer serializer = new Persister();

        serializer.write(address, writer);
        System.out.println("Wrote: " + writer.getBuffer());
    }

    public void testReading() throws Exception {
        String input = "<address street='1234 Main Street' city='San Francisco' state='CA'/>";
        Serializer serializer = new Persister();
        System.out.println("Read back: " + serializer.read(Address.class, new StringReader(input)));
    }
}

@Root
class Address {
    @Attribute(name="street")
    private final String street;

    @Attribute(name="city")
    private final String city;

    @Attribute(name="state")
    private final String state;

    public Address(@Attribute(name="street") String street, @Attribute(name="city") String city, @Attribute(name="state") String state) {
        super();
        this.street = street;
        this.city = city;
        this.state = state;
    }

    @Override
    public String toString() {
        return "Address [city=" + city + ", state=" + state + ", street=" + street + "]";
    }   
}

Это работает, но повторяющиеся аннотации @Attribute (в поле и в аргументе конструктора) в классе Address выглядят ужасно. Есть ли способ:

  • есть просто выяснить имя атрибута из имени поля?
  • имеет простое игнорирование сериализации, так что я могу избежать аннотирования полей или аргумента конструктора?

Ответы [ 3 ]

1 голос
/ 16 декабря 2009

Не думаю, что вам нужно все это повторение и атрибут дополнительных аннотаций. Если имя совпадает с атрибутом объекта, оно будет использоваться по умолчанию.

так что вы можете просто объявить его как:

@Root
class Address {
    @Attribute
    private final String street;

    @Attribute
    private final String city;

    @Attribute
    private final String state;

    public Address(String street, String city, String state) {
        super();
        this.street = street;
        this.city = city;
       this.state = state;
   }

   @Override
   public String toString() {
      return "Address [city=" + city + ", state=" + state + ", street=" + street + "]";
   }   
}
0 голосов
/ 12 июня 2015

У меня была похожая проблема, но с довольно сложными объектными структурами. Я решил это, используя библиотеку JAXB для маршалинга и демаршалинга, которая является довольно распространенной. Вы можете также рассмотреть возможность полного отделения логики маршалинга от вашего Java-класса с помощью аспектов - вы можете рассматривать все аннотации в отдельном аспекте, что сделает ваш Java-класс полностью чистым от маршалинг-аннотаций.

0 голосов
/ 16 декабря 2009

Java по умолчанию сериализует всех членов вашего класса, если они реализуют Serializable и придерживаются синтаксиса JavaBean.

...