2013-03-26 70 views
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錯誤,我的變換的寫入方法永遠不會被調用(通過斷點檢查)。

下面是我用序列化代碼:

 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)); 

寫方法拋出異常。我已經使用了Serialization third-party classes with Simple XML (org.simpleframework.xml)作爲參考,這是讓我進行反序列化的工作,但現在我陷入了困境。我不知道如何繼續。

任何幫助表示讚賞。

回答

2

原來問題出在答案。不支持錯誤XMLGregorianCalendarImpl。這不是我的匹配器檢查的。我不得不改變:

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

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

我希望這可以幫助別人。

相關問題