2009-12-15 2 views
5

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

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 аннотации (в поле и на аргументе конструктора) в классе Адреса выглядеть некрасиво. Есть ли способ:

  • имеют простую форму из названия атрибута от имени поля?
  • имеют простую сериализацию игнорирования, так что я могу уйти с аннотированием полей или аргумента конструктора?
+3

Если вы ищете упрощенную дескрипцию XML-> Java и не привязаны к определенному пакету, вот альтернатива: http://sourceforge.net/projects/practicalxml/ (обратите внимание, что я не помещал это как ответ, потому что вы, похоже, очень счастливы, что не очень хорошо относится к людям, которые пытаются вам помочь) – kdgregory

+0

@kdgregory Спасибо, я не привязан к конкретному пакету - я проверю практический xml. Пожалуйста, не принимайте нисходящие слова слишком лично - предлагаемые предложения нигде не приближались к решению моей проблемы и были шумными, ИМО. –

+1

@kdgregory Во второй раз я был слишком счастлив. Приносим извинения всем. –

ответ

1

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

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

@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

Нет, это не работает, по крайней мере, в Simple 2.1.3. –

+0

Плохо, я не обращал больше внимания на то, что вы хотели бы иметь неизменный адрес. Основываясь на текущей простой, вам нужно будет дублировать тег @Attribute, поскольку она использовала аннотацию атрибута для сериализации и конструктор для десериализации. Вы можете обойтись без тега name по атрибуту, но не по параметрам конструктора, поскольку компилятор отслеживает его только по порядку, а не по имени. –

+0

В зависимости от цели, которую вы пытаетесь достичь. Конечно, вы можете сделать класс изменчивым и принудительно установить неизменность вручную в установщике. Но опять же, код станет уродливым. Между двумя, я мог бы просто пойти с двойной аннотации вариант. –

0

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

+0

Я думаю, вы неправильно поняли вопрос. Я хочу дескриптор XML-> Java. –

+0

Сериализация Java работает в обоих направлениях. Если вы сериализуете объекты Java в XML с помощью сериализации Java, вы также можете десериализовать их из XML в объекты Java. Процесс прозрачный и гибкий.В одном приложении я использую Java-сериализацию/десериализацию XML для записи деревьев объектов на диск и чтения их по запросу пользователя - мы говорим о сотнях тысяч файлов - и это хорошо работает, на мой взгляд. Посмотрите http://java.sys-con.com/node/37550 примеры - ключевые классы - это XMLEncoder и XMLDecoder. – spork

0

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

Смежные вопросы