2011-05-18 115 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