Сериализация Java-объекта - PullRequest
2 голосов
/ 18 мая 2011

Дайте мне знать лучший способ сериализации моего Java-объекта Download.Это класс, сгенерированный из java-инструмента wsimport из WSDL.

@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-классы, сгенерированные из этого инструмента, не имеют какой-либо реализации серлизации.И я хочу сериализовать класс Download в следующем формате:

<?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.Я не знаю, как это сделать.

Спасибо

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Это JAXB . Вам понадобится:

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

, где out может быть много вещей, включая OutputStream, Writer и File. Если вы хотите получить его как String, используйте StringWriter

1 голос
/ 18 мая 2011

Это JAXB, и чтобы ваш пример работал, вам нужно предоставить корневой элемент и информацию о пространстве имен:

Корневой элемент

Когда вы выполняете маршалинг объекта с помощью JAXBдля этого требуется информация о корневом элементе.Один из способов сделать это - аннотировать ваш Download класс с помощью @XmlRootElement

@XmlRootElement(name="Download")
public class 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...