2011-05-18 98 views
2

让我知道序列化我的Java对象下载的最佳方式。这是一个从WSDL的java wsimport工具生成的类。序列化Java对象

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Download", propOrder = { 
    "Response", 
    "VendorInformation", 
    "DownloadItem", 
    "DownloadCommentItem", 
    "DownloadIntercomItem" 
}) 

public class Download 
{ 

    @XmlElement(name = "Response") 
    protected ResponseMessageManagementType Response; 
    @XmlElement(name = "VendorInformation") 
    protected DownloadVendorInformation VendorInformation; 
    @XmlElement(name = "DownloadItem") 
    protected List<DownloadDownloadItem> DownloadItem; 
    @XmlElement(name = "DownloadCommentItem") 
    protected ArrayOfDownloadDldComment DownloadCommentItem; 
    @XmlElement(name = "DownloadIntercomItem") 
    protected ArrayOfDownloadDldIntercom DownloadIntercomItem; 

    ......................... 
} 

该工具生成的java类没有任何serlization实现。 我想要序列化的下载类下面这样的格式:

<?xml version="1.0" encoding="utf-8"?> 
<Download xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="HTTP://xyz.abc.Com//Vendor/DownloadWSE.xsd"> 
    <Response> 
    ..... 
    </Response> 

    <VendorInformation> 
    ............... 
    </VendorInformation> 

    <DownloadItem> 
    <DownloadDownloadItem> 
     ....... 
    </DownloadDownloadItem> 
    <DownloadDownloadItem> 
     ....... 
    </DownloadDownloadItem> 
    <DownloadDownloadItem> 
     ....... 
    </DownloadDownloadItem> 
    </DownloadItem> 
    <DownloadCommentItem> 
    ........ 
    </DownloadCommentItem> 
    <DownloadIntercomItem> 
    ........ 
    </DownloadIntercomItem> 
</Download> 

你可以看到XmlElementName和XML字符串的内容之间的映射。 我在如何做到这一点的损失。

谢谢

回答

1

这是JAXB,并让您的示例工作,你需要提供根元素和名称空间信息:

根元素

当您使用JAXB编组对象时,需要有关根元素的信息。要做到这一点的方法之一是@XmlRootElement

@XmlRootElement(name="Download") 
public class Download 

来注释Download类,如果你不能做到这一点,你需要换你的Download例如在JAXBElement

Download download = new Download(); 
QName qname = new QName("HTTP://xyz.abc.Com//Vendor/DownloadWSE.xsd"; 
JAXBElement<Download> jaxbElement = new JAXBElement(qname, "Download"), Download.class, download); 

命名空间资格

也可以在使用包级别@XmlSchema注释后获得命名空间限定:

@XmlSchema(
    namespace="HTTP://xyz.abc.Com//Vendor/DownloadWSE.xsd", 
    elementFormDefault=XmlNsForm.QUALIFIED) 
package your.model.package.containing.download; 

import javax.xml.bind.annotation.*; 

演示

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.Marshaller; 
import javax.xml.namespace.QName; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Download.class); 

     Download download = new Download(); 
     QName qname = new QName("HTTP://xyz.abc.Com//Vendor/DownloadWSE.xsd"; 
     JAXBElement<Download> jaxbElement = new JAXBElement(qname, "Download"), Download.class, download); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(jaxbElement, System.out); 
    } 
} 
+0

是的。类定义中缺少RootElement。 – user759646 2011-05-19 11:50:54

2

这是JAXB。你将需要:

JAXBContext ctx = JAXBConetxt.newInstance(Download.class); 
Marshaller m = ctx.createMarshaller(); 
m.marshal(downloadObject, out); 

其中out可很多东西,包括OutputStreamWriterFile。如果你想获得它作为一个String,使用StringWriter

+0

该做的。谢谢。 – user759646 2011-05-18 18:02:09