如何创建采用 Generic 对象的 JAXB Marshaller

Fat*_*ats 1 java xml jaxb

本质上,我想做的是创建一个编组器,它可以接受我给它的任何类对象,例如汽车对象或人对象,并且它必须返回 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;
    }
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:

警告:发生了非法反射访问操作

小智 5

在代码中,您封送 objectToSerialize 的类,而不是对象本身。您可以更改此行

 marshaler.marshal(objToSerialize.getClass(),writer);
 //to
 marshaler.marshal(objToSerialize,writer);
Run Code Online (Sandbox Code Playgroud)

或者尝试使用以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)