我使用以下代码序列化一个类:
public String serialize(T oObject)
{
mMarshaller = getJAXBContext().createMarshaller();
mMarshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "UTF-8");
ByteArrayOutputStream strm = getOutputStream();
mMarshaller.marshal(oObject, strm);
return strm.toString();
}
但是当我查看generaetd XML时,那里有一个命名空间:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mapEntry>
<key xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">
Key
</key>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">
oValue
</value>
</mapEntry>
有没有办法删除它,或告诉JAXB它不应该添加这个?我整个上午都在看这个,并尝试了一些我通过谷歌找到的东西,但没有任何帮助。
现在我在这里发现了这个帖子:How to marshal without a namespace?但问题是接受的答案只是部分列出,现在我不知道这是否对我有帮助。 XMLStreamWriter
是一个接口,我不想为此实现整个流编写器。那么有没有办法扩展ByteArrayOutputStream
而不需要实现所有其他函数,这样XMLWriter需要?
答案 0 :(得分:2)
在此用例中,http://www.w3.org/2001/XMLSchema-instance
和http://www.w3.org/2001/XMLSchema
名称空间由于xsi:type
属性而被引入。正在引入xsi:type
属性,因为您的JAXB实现认为属性类型为Object
。解决方案是确保属性未键入Object
。
XML表示看起来像java.util.Map
的表示的一部分(参见:http://blog.bdoughan.com/2013/03/jaxb-and-javautilmap.html)。这是你的用例还是你有另一个对象模型?