代码之家  ›  专栏  ›  技术社区  ›  lessonz

Simple Framework中的自定义匹配器可以反序列化,但不能序列化

  •  3
  • lessonz  · 技术社区  · 13 年前

    我正在尝试让Simple在XMLGregorianCalendar中表现出色。在这样做的过程中,我创建了一个Matcher和Transform:

    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的写入方法从未被调用(通过断点进行检查)。

    以下是我用来序列化的代码:

            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方法引发异常。我用过 Serialization third-party classes with Simple XML (org.simpleframework.xml) 作为一个参考,这就是让我开始反序列化工作的原因,但现在我陷入了困境。我不知道该怎么做。

    任何帮助都将不胜感激。

    1 回复  |  直到 13 年前
        1
  •  2
  •   lessonz    13 年前

    事实证明答案就在这个问题上。所述错误 XMLGregorianCalendarImpl 不支持。这不是我的匹配器检查的。我只需要改变:

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

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

    我希望这能帮助到别人。

    推荐文章