2012-03-29 60 views
1

我有一个相对简单的类。我在我的服务器上使用JDK 1.7对其进行序列化,并在客户端上使用Android 2.2对其进行反序列化,两者均使用简单的xml 2.6.2。该类包含一个用@Attribute注解的Date字段。生成的XML看起来是这样的:SimpleXML反序列化其他对象序列化的对象给出了UnparseableDateException

<daySchedule id="e086b34c-2836-4ecb-af36-5764e3f44b21" date="2012-03-29 00:00:00.0 BST"> 
     <driver id="022cbb89-1226-4d85-ac28-b4848f3bc4ae" name="Julian"/> 
     <job id="1e444bf0-59ec-44f6-8f94-01e8606caa27" scheduledStartTime="2012-03-27 23:05:00.0 BST"> 
     <location id="8c00f18a-fc97-4f2c-a369-ec4efe62f4bb" clientId="92797509-600c-47b4-989d-150c7e695e95" name="The Phantom Coach"> 
      <gpsPoint latitude="52.390499114990234" longitude="-1.5485700368881226"/> 
     </location> 
     <task id="c6adff66-b342-4d24-874a-e676ce720af8" locationId="8c00f18a-fc97-4f2c-a369-ec4efe62f4bb" name="Have a drink" description="Something non-alcoholic, probably Diet Pepsi."/> 
     </job> 
    </daySchedule> 

当我尝试反序列化,我得到的例外是:

03-29 14:06:58.975: W/System.err(1583): java.text.ParseException: Unparseable date: 2012-03-29 00:00:00.0 BST 
03-29 14:06:58.975: W/System.err(1583):  at java.text.DateFormat.parse(DateFormat.java:645) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.transform.DateType$DateFormat.getDate(DateType.java:189) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.transform.DateType.getDate(DateType.java:112) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.transform.DateTransform.read(DateTransform.java:75) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.transform.DateTransform.read(DateTransform.java:44) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.transform.Transformer.read(Transformer.java:104) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Support.read(Support.java:185) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.PrimitiveFactory.getInstance(PrimitiveFactory.java:105) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Primitive.readTemplate(Primitive.java:231) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Primitive.read(Primitive.java:171) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Primitive.read(Primitive.java:126) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Composite.readVariable(Composite.java:687) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Composite.readInstance(Composite.java:635) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Composite.readAttribute(Composite.java:558) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Composite.readAttributes(Composite.java:474) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Composite.readSection(Composite.java:387) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Composite.read(Composite.java:367) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Composite.readDefault(Composite.java:262) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Composite.read(Composite.java:232) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Composite.read(Composite.java:202) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Composite.read(Composite.java:150) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Persister.read(Persister.java:632) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Persister.read(Persister.java:613) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Persister.read(Persister.java:591) 
03-29 14:06:58.985: W/System.err(1583):  at org.simpleframework.xml.core.Persister.read(Persister.java:550) 
03-29 14:06:58.995: W/System.err(1583):  at org.simpleframework.xml.core.Persister.read(Persister.java:451) 
03-29 14:06:58.995: W/System.err(1583):  at net.meridiandigital.binco.demo.LocationList$2.doInBackground(LocationList.java:78) 
03-29 14:06:58.995: W/System.err(1583):  at net.meridiandigital.binco.demo.LocationList$2.doInBackground(LocationList.java:1) 
03-29 14:06:58.995: W/System.err(1583):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
03-29 14:06:58.995: W/System.err(1583):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
03-29 14:06:58.995: W/System.err(1583):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
03-29 14:06:58.995: W/System.err(1583):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
03-29 14:06:58.995: W/System.err(1583):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
03-29 14:06:58.995: W/System.err(1583):  at java.lang.Thread.run(Thread.java:1096) 

有,这是与在Java: unparseable date exception但我的问题讨论了这个问题的可能性我如何解决这个问题?有没有办法我可以修复日期处理简单的XML,以避免使用Android中的错误代码?

更新1:

有趣的数据点,这里是从Android设备上生成文档的日期:

2012-03-30 07:00:38.552 GMT+01:00 

这,似乎工作正常。所以,也许有一种方法可以说服服务器上的Java产生这种格式的日期,而不是使用'BST'(或可能是其他类似的时区名称)?

回答

3

我从来没有找到一种方法来告诉系统不使用符号时区名称。我可以通过在SimpleDateFormat中使用兼容RFC822的时区支持几乎获得正确的日期格式,但它不完全正确。最后,我干脆决定强制系统在格林尼治标准时间使用时间:

private static final class GMTDateTransform implements Transform<Date> 
{ 
    ThreadLocal<SimpleDateFormat> sdf = new ThreadLocal<SimpleDateFormat>() { 
     protected SimpleDateFormat initialValue() 
     { 
      SimpleDateFormat r = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss.SSS zzz"); 
      r.setTimeZone (TimeZone.getTimeZone ("GMT")); 
      return r; 
     } 
    }; 

    public Date read (String source) throws Exception 
    { 
     return sdf.get().parse (source); 
    } 
    public String write (Date source) throws Exception 
    { 
     return sdf.get().format (source); 
    } 
} 

然后我用时,要求匹配日期类返回GMTDateTransform的静态实例的匹配器,并通过了对留存时我创造了它:

final GMTDateTransform transform = new GMTDateTransform(); 
    return new Persister(new Matcher() { 
     @Override 
     public Transform match(Class cls) throws Exception { 
      if (cls == Date.class) return transform; 
      return null; 
     } 
    }); 

(上面的代码是我实际的代码做什么的简化,因为我有其他类进行自定义转换,并使用类的一个HashMap转换映射找到正确的)

+0

你能分享你如何能够通过定制Matche r()给你的Persister?对于我匹配()返回一个自定义Transform(),我无法继续... – zombie 2012-07-03 08:36:04

+0

我已经用一个例子更新了答案。希望这可以帮助。 – Jules 2012-07-03 09:34:02