基本上,我想做的是创建一个编组器,该编组器可以接受我给它的任何类对象,例如汽车对象或人对象,并且必须返回XML字符串。
这是到目前为止我得到的:
public <T> String CreateXML(T objToSerialize)
{
String xml = "";
try
{
JAXBContext context = JAXBContext.newInstance(objToSerialize.getClass());
Marshaller marshaler = context.createMarshaller();
StringWriter writer = new StringWriter();
marshaler.marshal(objToSerialize.getClass(),writer);
xml = writer.toString();
System.out.println(xml);
return xml;
} catch (Exception e) {
System.out.println(e.getMessage());
}
return xml;
}
它给我以下错误:
警告:发生了非法的反射访问操作
答案 0 :(得分:2)
在您的代码中,封送objectToSerialize的类 而不是对象本身。 您可以更改此行
marshaler.marshal(objToSerialize.getClass(),writer);
//to
marshaler.marshal(objToSerialize,writer);
或尝试以下代码:
public static <T> String marshall(T data) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(data.getClass());
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
StringWriter stringWriter=new StringWriter();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
jaxbMarshaller.marshal(data, stringWriter);
return stringWriter.toString();
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
答案 1 :(得分:0)
对于通用转换,试试这个:
StringWriter sw = new StringWriter();
JAXBContext.newInstance(((JAXBElement) argument).getDeclaredType()).createMarshaller().marshal(argument, sw);
sb.append(sw.toString());