2014-02-10 4 views
1

XML을 사용하여 XML (XMLPanelList) 클래스를 만들려고하지만 프로그램을 실행할 때이 오류가 발생합니다.새로운 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

도서관과는 다르지만 오류 텍스트로 판단하면 XML 구성 요소의 직렬화 가능 인터페이스를 구현하십시오.

+0

그래서 나는 당신이 사용하고있는 라이브러리가 작동하는 것으로 가정했다. 직렬화와 비 직렬화간에 다른 jdk 버전을 사용하는 경우 모든 의도와 목적에 따라 문제가 있음을 알 수 있습니다 (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> 

행운을 빕니다.