【问题标题】:Serializing and deserializing Joda DateTime object序列化和反序列化 Joda DateTime 对象
【发布时间】:2015-10-06 05:52:45
【问题描述】:

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

我的项目使用 XML 序列化将对象保存到 XML 文件。在这种特殊情况下,我有一个具有 DateTime 属性的 Item 类。

在某些时候,我正在初始化对象,包括像这样的 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);
    }
}

显然,日期时间被保存在 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>

显然,它什么也没保存,但不,它只是保存“实际”日期时间。我的意思是,如果我将项目保存在 XML 文件中,例如 15:30,然后我在 18:00 加载 XML 文件,那么日期显示... 18:00!!

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

我做错了什么?

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

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

提前谢谢你。

【问题讨论】:

    标签: java xml datetime serialization jodatime


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我认为这是因为 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...)

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-28
        • 2015-01-11
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 2016-10-14
        • 2014-12-24
        • 2013-04-11
        相关资源
        最近更新 更多