简体   繁体   English

无法使用新的readObject()/ writeObject()方法反序列化对象

[英]Cannot deserialize object with new readObject()/writeObject() methods

So I'm trying to create a class (XMLPanelList) from XML using xStream, but I'm getting this error when I run my program. 因此,我尝试使用xStream从XML创建一个类(XMLPanelList),但是在运行程序时出现此错误。

<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)

I have no idea how to fix it, and Google tells me nothing. 我不知道如何解决它,而Google却什么也没告诉我。 Here is the XML file "test.xml" 这是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>

And here is the code: 这是代码:

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();
        }
    }

}

How do I fix the error given? 如何解决给出的错误?

I've had a similar problem when switching from standard java.util.List to a specialized list. 从标准java.util.List切换到专用列表时,我遇到了类似的问题。 Try and see if the object loads when you change the root element of your XML file to: 尝试查看将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>

Good luck. 祝好运。

不是使用库,而是根据错误文本判断,为XML组件实现可序列化的接口。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM