Какой из них имеет лучшую производительность для создания Xml String, Jaxb или StringBuffer?

Я должен создать следующую строку xml,

<trx>
 <svc>CheckoutStartSession</svc>
 <prj>PRJ</prj>
 <cty>ABC</cty>
 <com>Internet</com>
 <cur>DEF</cur>
 <ord>1234</ord>
 <net>1.0</net>
 <tax>0.0</tax>
 <grs>1.0</grs>
 <ses>
 <suu>SCHEME://IP:PORT/CONTEXT_PATH/SUU</suu>
 <fau>SCHEME://IP:PORT/CONTEXT_PATH/FAU</fau>
 <sty>SCHEME://IP:PORT/CONTEXT_PATH/STY</sty>
 <cvi>Required</cvi>
 <act>AUTHORIZE</act>
 <lan>en-US</lan>
 </ses>
 <cus>
 <ctp>PRIVATE</ctp>
 <fnm>PRATEEK</fnm>
 </cus>
</trx>

Создание XML-строк с использованием JAXB

public class PGReqConfig {

 public static void main(String[] args) throws JAXBException {

 RequestSession sessionConfig = new RequestSession();
 sessionConfig.setSuccessNotifURL("SCHEME://IP:PORT/CONTEXT_PATH/SUU");
 sessionConfig.setFailureNotifURL("SCHEME://IP:PORT/CONTEXT_PATH/FAU");
 sessionConfig.setStyleSheetURL("SCHEME://IP:PORT/CONTEXT_PATH/STY");
 sessionConfig.setAction("AUTHORIZE");
 sessionConfig.setCvcInput("Required");
 sessionConfig.setLaguage("en-US");

 CustomerDetails customerData = new CustomerDetails();
 customerData.setCustomerType("PRIVATE");
 customerData.setFirstName("PRATEEK");

 TransactionRequest transactionConfig = new TransactionRequest();
 transactionConfig.setService("CheckoutStartSession");
 transactionConfig.setConsentMedium("Internet");
 transactionConfig.setProjectCode("PRJ");
 transactionConfig.setCountryCode("ABC");
 transactionConfig.setCurrencyCode("DEF");
 transactionConfig.setNet("1.0");
 transactionConfig.setTax("0.0");
 transactionConfig.setGross("1.0");
 transactionConfig.setOrderId("1234");
 transactionConfig.setCustomerData(customerData);
 transactionConfig.setPaymentSession(sessionConfig);

 StringWriter xmlData = new StringWriter();

 JAXBContext context = JAXBContext.newInstance(TransactionRequest.class);
 Marshaller marshal = context.createMarshaller();
 marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
 marshal.setProperty(Marshaller.JAXB_FRAGMENT, true);
 marshal.marshal(transactionConfig, xmlData);

 System.out.println(xmlData.toString());
 }

}

@XmlRootElement(name = "TRX")
@XmlAccessorType(XmlAccessType.FIELD)
class TransactionRequest{
 @XmlElement(name = "SVC")
 private String service;

 @XmlElement(name = "PRJ")
 private String projectCode;

 @XmlElement(name = "CTY")
 private String countryCode;

 @XmlElement(name = "COM")
 private String consentMedium;

 @XmlElement(name = "CUR")
 private String currencyCode;

 @XmlElement(name = "ORD")
 private String orderId;

 @XmlElement(name = "NET")
 private String netAmount;

 @XmlElement(name = "TAX")
 private String taxAmount;

 @XmlElement(name = "GRS")
 private String grossAmount;

 @XmlElement(name = "SES")
 private RequestSession paymentSession;

 @XmlElement(name = "CUS")
 private CustomerDetails customerData;

 ......

}

@XmlAccessorType(XmlAccessType.FIELD)
class RequestSession{

 @XmlElement(name = "SUU")
 private String successNotifURL;

 @XmlElement(name = "FAU")
 private String failureNotifURL;

 @XmlElement(name = "STY")
 private String styleSheetURL;

 @XmlElement(name = "CVI")
 private String cvcInput; 

 @XmlElement(name = "ACT")
 private String action; 

 @XmlElement(name = "LAN")
 private String laguage;

 ......
}

@XmlAccessorType(XmlAccessType.FIELD)
class CustomerDetails{

 @XmlElement(name = "CTP")
 private String customerType; 

 @XmlElement(name = "FNM")
 private String firstName;

 ......
}

Создание XML-строки с использованием StringBuffer

StringBuffer trxTag = new StringBuffer();
trxTag.append("<trx>" + "<svc>CheckoutStartSession</svc>");
trxTag.append("<prj>PRJ</prj>");
trxTag.append("<cty>ABC</cty>");
trxTag.append("<com>Internet</com>");
trxTag.append("<cur>DEF</cur>");

StringBuffer cusTag = new StringBuffer("<cus>");
cusTag.append("<ctp>Private</ctp>")
 .append("<fnm>PRATEEK</fnm>")
 .append("</cus>");

StringBuffer sesTag = new StringBuffer("<ses>");
sesTag.append("<suu>SCHEME://IP:PORT/CONTEXT_PATH/SUU</suu>")
 .append("<fau>SCHEME://IP:PORT/CONTEXT_PATH/FAU</fau>")
 .append("<sty>SCHEME://IP:PORT/CONTEXT_PATH/STY</sty>")
 .append("<cvi>Required</cvi>")
 .append("<lan>en-US</lan>")
 .append("<act>Authorize</act>" + "</ses>");

trxTag.append("<ord>1234</ord>")
 .append("<net>1.0</net>")
 .append("<tax>0.0</tax>")
 .append("<grs>1.0</grs>")
 .append(cusTag)
 .append(sesTag)
 .append("</trx>");

System.out.println(trxTag.toString());

1. Какой из них лучше с точки зрения производительности JAXB и StringBuffer?

2. Также предлагаете другие методологии помимо двух выше?

2 ответа

Недостаточная читаемость кода StringBuffer. Посмотрите на StAX (XMLStreamWriter).


Ну, если это односторонняя операция, и если XML такой же простой, как в вопросе, и не меняется во времени, то JAXB не имеет шансов с точки зрения производительности, StringBuffer намного быстрее.

licensed under cc by-sa 3.0 with attribution.