我正在努力让 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) 的序列化第三方类作为参考,这就是让我开始反序列化工作的原因,但现在我被困住了。我不确定如何进行。
任何帮助表示赞赏。