2012-10-20 1 views
0

Я пытаюсь научиться XStream, и я следовал за API, а как я могу понять, но следующий фрагмент кодаСписок XStream.fromXML производство пустой список

List<Rectangle> rectangleArray = new ArrayList<Rectangle>(); 
xstream = new XStream(new DomDriver()); 
List<Rectangle> rectangleArray2 = new ArrayList<Rectangle>(); 

rectangleArray.add(new Rectangle(18,45,2,6)); 
String xml = xstream.toXML(rectangleArray); 
System.out.println(xml); 
xstream.fromXML(xml, rectangleArray2); 
System.out.println("new list size: " + rectangleArray2.size()); 

производит вывод

<list> 
    <java.awt.Rectangle> 
    <x>18</x> 
    <y>45</y> 
    <width>2</width> 
    <height>6</height> 
    </java.awt.Rectangle> 
</list> 
new list size: 0 

и я не могу понять, почему rectangleArray2 теперь не является копией rectangleArray. Любая помощь?

+0

Может быть, вы должны написать собственный конвертер. Я не понимаю, но я буду читать. –

ответ

0

Обработка List через XStream немного сложнее. Для обработки списка, необходимо определить класс-оболочки для хранения списка своего, например:

public class RectangleList { 

     private List<Rectangle> rectangles = new ArrayList<Rectangle>(); 

     public List<Rectangle> getRectangles() { 
      return rectangles; 
     } 

     public void setRectangles(List<Rectangle> rectangles) { 
      this.rectangles = rectangles; 
     } 
    } 

Затем добавьте alias для списка RectangleList класса, как

 xstream.alias("list", RectangleList.class); 

и зарегистрировать неявный преобразователь для управления список, как:

 xstream.addImplicitCollection(RectangleList.class, "rectangles"); 

Если вы хотите, чтобы ваш <java.awt.Rectangle> печатать, как <rectangle>, зарегистрировать анс псевдоним, как показано ниже:

 xstream.alias("rectangle", Rectangle.class); 

Теперь использовать вас RectangleList класс для преобразования, он должен работать нормально.

Окончательный тестовый код будет выглядеть следующим образом:

RectangleList recListInput = new RectangleList(); 
    RectangleList recListOutput = new RectangleList(); 
    XStream xstream = new XStream(new DomDriver()); 
    xstream.alias("list", RectangleList.class); 
    xstream.alias("rectangle", Rectangle.class); 
    xstream.addImplicitCollection(RectangleList.class, "rectangles"); 

    ArrayList<Rectangle> rectangleArray = new ArrayList<Rectangle>(); 
    rectangleArray.add(new Rectangle(18,45,2,6)); 
    recListInput.setRectangles(rectangleArray); 
    String xml = xstream.toXML(rectangleArray); 
    System.out.println(xml); 
    xstream.fromXML(xml, recListOutput); 
    System.out.println("new list size: " + recListOutput.getRectangles().size()); 

Это напечатает выход как:

<list> 
     <rectangle> 
     <x>18</x> 
     <y>45</y> 
     <width>2</width> 
     <height>6</height> 
     </rectangle> 
    </list> 
    new list size: 1 
+0

Благодарим вас за этот очень тщательный ответ. Если я могу спросить следующее: я последовал за вашим примером, а «RectangleList.class» вызывает исключение NullPointerException во время выполнения. Любая идея почему? –

+0

Какая линия? Я поделился рабочим примером. Вы определили свой атрибут в классе RectangleList как 'private List rectangles = new ArrayList ();' i.e. с инициализацией? –

+0

На моей машине xstream.addImplicitCollection (RectangleList.class, "rectangles"); бросает исключение NullPointerException. Я работаю над этим. –

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

  • Нет связанных вопросов^_^