序列化和反序列化Joda DateTime对象



我已经开始将一个项目从使用Java标准日期迁移到Joda DateTime。

我的项目使用XML序列化将对象保存到XML文件中。在这个例子中,我有一个Item类,它有一个DateTime属性。

在某些地方,我正在初始化对象,包括DateTime属性,如下所示:

        Item item = new Item();
        item.setIdSearchCriteria(this.searchCriteria.getId());
        item.setUrl(fullUrl);
        item.setTitle(itemTitle);   
        item.setDateTime(new DateTime());

我使用XMLEncoder使用一个辅助类来序列化项目:

public void saveDataList(List<Serializable> dataList) throws DAOGenericException 
{
    if(dataList == null)
        throw new IllegalArgumentException();
    checkDirectory();
    ArrayList<Serializable> writtenObject = (ArrayList<Serializable>) dataList;
    FileOutputStream os;
    try {
        // Save data as xml file
        os = new FileOutputStream(new File(fullFilename));
        XMLEncoder encoder = new XMLEncoder(os);
        encoder.writeObject(writtenObject);
        encoder.close();
    } catch (FileNotFoundException e) 
    {
        throw new DAOGenericException(e.getMessage(),e);
    }
}

显然,DateTime被保存在xml…但是没有值:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
 <object class="java.util.ArrayList">
  <void method="add">
   <object class="com.pikes.domain.Item">
    <void property="dateTime">
     <object class="org.joda.time.DateTime"/>
    </void>
    <void property="id">
     <int>1</int>
    </void>
    <void property="idSearchCriteria">
     <int>1</int>
    </void>
    <void property="title">
     <string>A title</string>
    </void>
    <void property="url">
     <string>http://www.random-url.com</string>
    </void>
   </object>
  </void>
 </object>
</java>

显然,它没有保存任何东西,但是不,它只是保存"实际"DateTime。我的意思是,如果我在15:30将Item保存在XML文件中,然后,我在18:00加载XML文件,那么日期显示……18:00 ! !

当然这不是我所期望的行为。我希望在XML文件中保存毫秒数,所以每当我反序列化对象时,我每次都会得到相同的DateTime。

我做错了什么?

我也尝试了以下操作,得到了相同的结果:

item.setDateTime(DateTime.now());
item.setDateTime(Instant.now().toDateTime());

提前感谢。

您需要为Jodatime创建一个java.beans.PersistenceDelegate实现,并使用setPersistenceDelegate方法将其设置为java.beans.XMLEncoder上各自类型的持久性委托。

我认为这是因为DateTime没有任何属性(即getXXX/setXXX),所以XMLEncoder不会找到任何序列化

你可以把DateTime包装成另一种处理序列化/反序列化的类型,例如像这样…

public class DateTimeHolder {
    private DateTime dateTime;
    // Use this to create one of these holders
    public static DateTimeHolder holderFor(DateTime dateTime) {
        DateTimeHolder h = new DateTimeHolder();
        h.dateTime = dateTime;
        return h;
    }
    // Use this to get the actual date time value
    public DateTime dateTime() {
        return dateTime;
    }

    // PROPERTIES...
    public String getTime() {
        // Format the date time as a string
    }
    public void setTime(String time) {
        // Parse the string into a date time and set the field
    }
}

如果希望对XML有更多的控制,最好使用更高级的框架,如JAXB。(我从来没有真正使用过XMLEncoder之前…)

希望能有所帮助

相关内容

  • 没有找到相关文章

最新更新