在使用JAXB封送泛型对象时如何摆脱命名空间

时间:2013-06-20 10:28:03

标签: java serialization jaxb xml-namespaces

我使用以下代码序列化一个类:

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需要?

1 个答案:

答案 0 :(得分:2)

在此用例中,http://www.w3.org/2001/XMLSchema-instancehttp://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)。这是你的用例还是你有另一个对象模型?