JAXB.marshal 구현을 가져오고 jaxb.fragment = true를 추가하여 XML 프롤로그를 제거했습니다. 이 메서드는 XmlRootElement 주석 없이도 개체를 처리 할 수 있습니다. 또한 확인되지 않은 DataBindingException이 발생합니다.
public static String toXmlString(Object o) {
try {
Class<?> clazz = o.getClass();
JAXBContext context = JAXBContext.newInstance(clazz);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); // remove xml prolog
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // formatted output
final QName name = new QName(Introspector.decapitalize(clazz.getSimpleName()));
JAXBElement jaxbElement = new JAXBElement(name, clazz, o);
StringWriter sw = new StringWriter();
marshaller.marshal(jaxbElement, sw);
return sw.toString();
} catch (JAXBException e) {
throw new DataBindingException(e);
}
}
컴파일러 경고가 신경 쓰이는 경우 여기에 템플릿 화 된 두 매개 변수 버전이 있습니다.
public static <T> String toXmlString(T o, Class<T> clazz) {
try {
JAXBContext context = JAXBContext.newInstance(clazz);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); // remove xml prolog
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // formatted output
QName name = new QName(Introspector.decapitalize(clazz.getSimpleName()));
JAXBElement jaxbElement = new JAXBElement<>(name, clazz, o);
StringWriter sw = new StringWriter();
marshaller.marshal(jaxbElement, sw);
return sw.toString();
} catch (JAXBException e) {
throw new DataBindingException(e);
}
}
StringWriter
아주 오래되었습니다. 내부적으로는StringBuffer
훨씬 빠른 접근 방식이 사용StringBuilder
되었지만 StringWriter가 처음 만들어 졌을 때는 존재하지 않았던 곳 을 사용 합니다. 이 때문에 모든 호출은sw.toString()
동기화 를 의미합니다. 성능을 찾고 있다면 좋지 않습니다.