2013-03-26 2 views
3

Simple을 XMLGregorianCalendar로 멋지게 처리하려고합니다. 그래서 정규를 생성하고 변환 한 I함으로써 :Simple Framework의 사용자 정의 Matcher가 직렬화를 역 직렬화하기 위해 작동합니다.

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

내가 시도 불행하게도 때 그것은 serialize하는 데 사용하려면 작동하지 않습니다, 그것은 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)); 

쓰기 방법은 예외를 throw :

는 여기에 내가 직렬화하는 데 사용하는 코드입니다. 나는 Serialization third-party classes with Simple XML (org.simpleframework.xml)을 참조로 사용했으며, 이것이 내가 deserialization 작업에 참여하게했지만 지금은 붙어 있습니다. 계속 진행하는 방법을 모르겠습니다.

도움을 주시면 감사하겠습니다.

답변

2

답변에 문제가있는 것으로 판명되었습니다. 오류는 XMLGregorianCalendarImpl이 지원되지 않습니다. 이것은 내 Matcher가 확인한 것이 아닙니다. 난 그냥 변경했다 :

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

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

에 나는이 사람을 도움이되기를 바랍니다.