我已经开始将一个项目从使用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之前…)
希望能有所帮助