UnmarshaException 意外元素,预期元素为(无)

2024-03-16

当我想反序列化我已经从字节数组序列化的 JAXBElement 时,我遇到了问题。我得到了例外:

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Avizo"). Expected elements are (none)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:243)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:238)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1048)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:483)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:465)

这是我的代码:

public class JAXBTest {

    public static byte[] serialize(JAXBElement<AvizoType> xmlData) throws Exception {
        // Result stream buffer
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        final JAXBContext jaxbContext = JAXBContext.newInstance(AvizoType.class);

        final Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.marshal(xmlData, new StreamResult(bos));

        return bos.toByteArray();
    }

    public static JAXBElement<AvizoType> deserialize(byte[] data) throws Exception {
        // Result stream buffer
        ByteArrayInputStream bis = new ByteArrayInputStream(data);

        final JAXBContext jaxbContext = JAXBContext.newInstance(AvizoType.class);

        final Unmarshaller marshaller = jaxbContext.createUnmarshaller();

        return (JAXBElement<AvizoType>) marshaller.unmarshal(bis);
    }

    public static void main(String[] args) throws Exception {
        AvizoType type = new AvizoType();
        type.setAvizoId(1);

        JAXBElement<AvizoType> element = new JAXBElement(new QName("Avizo"), AvizoType.class, type);

        byte[] result = serialize(element);
        deserialize(result);

    }
}

avizoType 是从 xsd 生成的类:

    //
    // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.10-b140310.1920 
    // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
    // Any modifications to this file will be lost upon recompilation of the source schema. 
    // Generated on: 2015.03.23 at 01:59:39 PM CET 
    //


    import java.io.Serializable;

    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlType;

    /**
     * <p>
     * Java class for AvizoType complex type.
     * 
     * <p>
     * The following schema fragment specifies the expected content contained within this class.
     * 
     * <pre>
     * &lt;complexType name="AvizoType">
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;element name="AvizoId" type="{http://www.w3.org/2001/XMLSchema}long"/>
     *       &lt;/sequence>
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/complexType>
     * </pre>
     * 
     * 
     */

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AvizoType", propOrder = { "avizoId" })
public class AvizoType implements Serializable {

    @XmlElement(name = "AvizoId")
    protected long avizoId;

    /**
     * Gets the value of the avizoId property.
     * 
     */
    public long getAvizoId() {
        return avizoId;
    }

    /**
     * Sets the value of the avizoId property.
     * 
     */
    public void setAvizoId(long value) {
        this.avizoId = value;
    }

}

你应该有一个名为ObjectFactory在你的班级旁边AvizoType。如果是这样,请尝试以下方法:

final JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
return ((JAXBElement<AvizoType>) jaxbContext.createUnmarshaller().unmarshal(
                inputStream)).getValue();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UnmarshaException 意外元素,预期元素为(无) 的相关文章

随机推荐