3

我正在努力让 XMLGregorianCalendar 变得简单。这样做我创建了一个匹配器和转换:

public class MyMatcher implements Matcher {

    @Override
    public Transform<?> match(@SuppressWarnings("rawtypes") final Class type) throws Exception {
        if (type.equals(XMLGregorianCalendar.class)) {
            return new XMLGregorianCalendarTransform();
        }

        return null;
    }

}

public class XMLGregorianCalendarTransform implements Transform<XMLGregorianCalendar> {

    @Override
    public XMLGregorianCalendar read(final String value) throws Exception {
        return DatatypeFactory.newInstance().newXMLGregorianCalendar(value);
    }

    @Override
    public String write(final XMLGregorianCalendar value) throws Exception {
        return value.toXMLFormat();
    }

}

当这段代码用于反序列化时,效果很好:

        final Serializer serializer = new Persister(new MyMatcher());
        obj = serializer.read(type, new ByteArrayInputStream(xml.getBytes(Charset.forName(UTF8_ENCODING))));

不幸的是,当我尝试使用它进行序列化时,它不起作用,它抛出Failed to create xml string for the object. org.simpleframework.xml.transform.TransformException: Transform of class com.sun.org.apache.xerces.internal.jaxp.datatyp e.XMLGregorianCalendarImpl not supported错误,我的 Transform 的 write 方法永远不会被调用(通过断点检查)。

这是我用来序列化的代码:

        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        os = new DataOutputStream(baos);
        final Serializer serializer = new Persister(new MyMatcher());
        serializer.write(this, os);
        os.flush();
        xmlString = new String(baos.toByteArray(), Charset.forName(UTF8_ENCODING));

write 方法抛出异常。我使用了带有 Simple XML (org.simpleframework.xml) 的序列化第三方类作为参考,这就是让我开始反序列化工作的原因,但现在我被困住了。我不确定如何进行。

任何帮助表示赞赏。

4

1 回答 1

2

事实证明,答案就在问题中。声明的错误XMLGregorianCalendarImpl不受支持。这不是我的 Matcher 检查的内容。我只需要改变:

    if (type.equals(XMLGregorianCalendar.class)) {

    if (XMLGregorianCalendar.class.isAssignableFrom(type)) {

我希望这可以帮助别人。

于 2013-03-26T23:51:13.570 回答