2014-02-10 3 views
1

Так что я пытаюсь создать класс (XMLPanelList) из XML с помощью xStream, но я получаю эту ошибку при запуске моей программы.Не удается десериализовать объект с помощью новых методов readObject()/writeObject()

<panels> <panel>  <name>Test 1</name>  <component>   <name>TestComponant</name>   <type>0</type>  </component> </panel> <panel>  <name>Test 2</name>  <component>   <name>TestComponant2</name>   <type>1</type>  </component> </panel></panels> 
com.thoughtworks.xstream.converters.ConversionException: Cannot deserialize object with new readObject()/writeObject() methods 
---- Debugging information ---- 
class    : XMLPanel 
required-type  : XMLPanel 
converter-type  : com.thoughtworks.xstream.converters.reflection.SerializableConverter 
path    : /panels/panel 
class[1]   : XMLPanelList 
converter-type[1] : com.thoughtworks.xstream.converters.reflection.ReflectionConverter 
version    : 1.4.7 
------------------------------- 
    at com.thoughtworks.xstream.converters.reflection.SerializableConverter.doUnmarshal(SerializableConverter.java:333) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:257) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:377) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:257) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134) 
    at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) 
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1185) 
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1169) 
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1040) 
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1031) 
    at XStreamTest.main(XStreamTest.java:64) 

Я понятия не имею, как это исправить, и Google ничего мне не говорит. Вот файл XML "test.xml"

<panels> 
    <panel> 
     <name>Test 1</name> 
     <component> 
      <name>TestComponant</name> 
      <type>0</type> 
     </component> 
    </panel> 
    <panel> 
     <name>Test 2</name> 
     <component> 
      <name>TestComponant2</name> 
      <type>1</type> 
     </component> 
    </panel> 
</panels> 

А вот код:

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.util.Vector; 

import javax.swing.JFrame; 

import com.thoughtworks.xstream.XStream; 
import com.thoughtworks.xstream.io.xml.DomDriver; 

class XMLPanelList { 

    Vector<XMLPanel> xmlPanels; 

    public XMLPanelList(){ }; 
} 

class XMLPanel extends JFrame{ 
    String name; 
    Vector<XMLComponent> xmlComps; 

    public XMLPanel(){ 
     super("XMLPanel");  
    } 
} 

class XMLComponent { 
    String name; 
    int type; 

    public XMLComponent(){} 

    public XMLComponent(String name, int type){ 
     this.name = name; 
     this.type = type; 
    } 
} 

public class XStreamTest { 
    public static void main(String[] args) { 
     try{ 
      BufferedReader br = new BufferedReader(new FileReader(new File("test.xml"))); 

      StringBuilder sb = new StringBuilder(); 
      String line; 

      while ((line = br.readLine()) != null) { 
       sb.append(line); 
      } 

      String everything = sb.toString(); 
      System.out.println(everything); 
      br.close(); 


      XStream xstream = new XStream(new DomDriver()); 

      xstream.alias("panels", XMLPanelList.class); 
      xstream.alias("panel", XMLPanel.class); 
      xstream.alias("component", XMLComponent.class); 

      xstream.addImplicitArray(XMLPanelList.class, "xmlPanels", "panel"); 
      xstream.addImplicitArray(XMLPanel.class, "xmlComps", "component"); 
      XMLPanelList xmlTrans = (XMLPanelList) xstream.fromXML(everything); 

      System.out.println(xstream.toXML(xmlTrans)); 
     } 

     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

} 

Как исправить ошибку дали?

ответ

-4

Не famaliar с библиотекой, но судя по тексту ошибки, Внедрите сериализуемый интерфейс для ваших XML-компонентов.

+0

Итак, я предположил, что библиотека, которую вы использовали, была рабочей реализацией. Оказывается, это нарушено для всех целей и целей, когда вы используете разные версии jdk между сериализацией и десериализацией (ref: http://xstream.10960.n7.nabble.com/Can-t-deserialize-old-xml-with-SynchronizedRandomAccessList- td8305.html). –

1

У меня была аналогичная проблема при переходе с обычного java.util.List на специализированный список. Попробуйте и посмотрите, загружается ли объект при изменении корневого элемента вашего файла XML на:

<panels serialization="custom"> 
    <panels> 
    <default/> 
    <int>[TOTAL-NUMBER-OF-PANELS]</int> 
    <panel> 
     <name>Test 1</name> 
     <component> 
     <name>TestComponant</name> 
     <type>0</type> 
     </component> 
    </panel> 
    <panel> 
     <name>Test 2</name> 
     <component> 
     <name>TestComponant2</name> 
     <type>1</type> 
     </component> 
    </panel> 
    </panels> 
</panels> 

Удачи.

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