当我想要从字节数组中序列化的JAXBElement deserialaze时,我遇到了问题。我有例外:
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>
* <complexType name="AvizoType">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="AvizoId" type="{http://www.w3.org/2001/XMLSchema}long"/>
* </sequence>
* </restriction>
* </complexContent>
* </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;
}
}
答案 0 :(得分:2)
您的班级ObjectFactory
旁边应该有一个名为AvizoType
的班级。如果是这样,那么尝试这种方法:
final JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
return ((JAXBElement<AvizoType>) jaxbContext.createUnmarshaller().unmarshal(
inputStream)).getValue();
答案 1 :(得分:1)
元素可以与具有@XmlRootElement
或@XmlElementDecl
注释的类相关联。如果是后者,则需要确保生成的ObjectFactory
是用于引导JAXBContext
的类的一部分。对于从XML Schema生成的模型,您应该在生成的包名称或JAXBContext
类上创建ObjectFactory
。